Java 스레드 풀 ExecutorService
1. 스레드 풀
1.1 어떤 상황에서 스레드 풀을 사용합니까?
1.2 스레드 풀 사용의 이점
2. ExecutorService 및 집행자
2.1 소개
ExecutorService는 집행자를 물려받는 인터페이스입니다.
공개 인터페이스 executorService 확장 집행자 {}집행자는 또한 하나의 방법 만 포함하는 인터페이스입니다.
공개 인터페이스 executor {void execute (runnable command);} Java에있는 스레드 풀의 최상위 인터페이스는 엑시 투어이지만 엄격하게 말하면 >> 엑스트르는 스레드 풀이 아니라 스레드를 실행하기위한 도구 일뿐입니다. 실제 스레드> 풀 인터페이스는 ExecutorService입니다.
3. 실행가
다양한 유형의 스레드 풀을 생성 할 수있는 정적 공장 클래스이며 일부 소스 코드는 다음과 같습니다.
공공 클래스 집행자 {// newfixedthreadpoolpublic static executorService newfixedthreadpool (int nthreads) {return new ThreadPooleExecutor (nthreads, nthreads, 0l, timeUnit.milliseconds, new LinkedBlockingqueue <Runnable> ());});}); newCachedThreadPool () {return new ThreadPoolexecutor (0, integer.max_value, 60L, TimeUnit.seconds, new Synchronousqueue <Runnable> ()); } // NewsCheDuledThreadPool 공개 정적 ScheduleDexecutorService NewsCheduledThreadPool (int corepoolsize) {return new ScheduledThreadPooleExecutor (CorePoolSize); } // Newstringoo}먼저 특정 예를 살펴보고 예제를 사용하여 예제를 사용하여 유사점과 차이점을 설명하겠습니다.
패키지 스레드; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.scheduledexecutorservice;/*** 16-7-11에 생성 된. */public class ch09_Executor {private static void run (executorService threadPool) {for (int i = 1; i <5; i ++) {최종 int taskid = i; ThreadPool.Execute (new Runnable () {@override public void run () {for (int i = 1; i <5; i ++) {try {thread.sleep (20);} catch (InterruptedException e) {e.printstacktrace ();} system.out.println ( "+taskId+"})}}}}}}}}}}}}; threadpool.shutdown (); public static void main (string [] args) {// executorservice fixedthreadpool = executor.newfixedThreadPool (3)을 수용 할 수있는 스레드 풀을 만듭니다 단일 스레드의 실. run (fixedthreadpool) // 런 (Cachethreadpool); // (2) // run (Singlethreadpool); // (3) // run (scheduledthreadpool); // (4)}}4. 4 일반적으로 사용되는 스레드 풀
4.1 Cachedthreadpool
CachedThreadpool은 초기 스레드를 캐시하고 캐시에서 6 초 동안 사용되지 않은 스레드를 종료하며 제거하는 캐시 영역을 만듭니다.
스레드를 사용할 수있는 경우 이전에 만든 스레드를 사용하십시오. 스레드를 사용할 수없는 경우 새 스레드를 만듭니다.
. 거부 :
캐시 형 풀, 먼저 풀에 생성 된 스레드가 있는지 확인하십시오. 하나가 있으면 재사용하십시오. 아무도 없다면 새 스레드를 만들어 수영장에 추가하십시오.
시나리오 사용 :
캐시 풀은 일반적으로 짧은 수명으로 일부 비동기 작업을 수행하는 데 사용되므로 일부 연결 지향 데몬 유형 서버에는 많이 사용되지 않습니다.
타임 아웃 :
재사용 할 수있는 스레드는 타임 아웃 유휴 내에서 수영장의 스레드 여야합니다. 기본 시간 초과는 60 대입니다. 이 유휴 기간이 초과되면 스레드 인스턴스가 종료되고 풀이 제거됩니다.
마치다:
캐시드 스레드 풀에 넣는 스레드는 그 끝에 대해 걱정할 필요가 없습니다. 시간 초과 후 비활성화되면 자동으로 종료됩니다.
예제 설명 :
(2)의 주석을 제거하고 실행하십시오. 작업 결과는 다음과 같습니다.
첫 번째 작업의 첫 번째 시간, 세 번째 작업의 세 번째 시간, 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간의 두 번째 시간의 두 번째 시간의 두 번째 시간의 두 번째 시간의 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 두 번째 시간입니다. 첫 번째 작업의 시간, 첫 번째 작업의 네 번째 시간, 네 번째 시간의 네 번째 시간, 네 번째 작업 중 네 번째 시간, 네 번째 작업 중 네 번째 시간의 네 번째 시간, 네 번째 시간의 네 번째 시간, 네 번째 작업 중 네 번째 시간, 네 번째 작업 중 네 번째 시간, 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간은 네 번째 시간입니다. 첫 번째 과제, 첫 번째 과제의 네 번째 시간 중 네 번째 시간 인 첫 번째 과제, 첫 번째 과제의 네 번째 시간 중 네 번째 시간, 네 번째 시간은
결과에서 4 개의 작업이 교대로 실행된다는 것을 알 수 있습니다.
4.2fixedthreadpool
FixedThreadpool에는 고정 크기의 수영장이 있으며
현재 작업이 풀 크기를 초과 해야하는 경우 작업을 실행할 수있는 무료 스레드가있을 때까지 많은 나가는 작업이 대기 상태에 있습니다.
현재 실행 해야하는 작업이 풀 크기보다 작 으면 유휴 스레드가 파괴되지 않습니다.
재사용 :
FixedThreadpool은 Cachethreadpool과 유사하며 재사용 할 수있는 경우에도 사용할 수 있지만 언제든지 새 스레드를 만들 수는 없습니다.
정족수
그것의 독창성은 언제라도 고정 된 수의 활성 스레드 만있을 수 있다는 것입니다. 현재 새 스레드가 설정되어 있으면 다른 대기열에만 배치되어 현재 스레드의 스레드가 끝나고 풀에서 직접 이동할 때까지 기다릴 수 있습니다.
타임 아웃 :
Cachethreadpool과 달리 FixedThreadpool에는 유휴 메커니즘이 없습니다
시나리오 사용 :
따라서 대부분의 FixedThreadpool은 매우 안정적이고 고정 된 정기적 인 동시 스레드를 목표로하며 주로 서버에서 사용됩니다.
소스 코드 분석 :
메소드의 소스 코드에서 판단하면 캐시 풀과 고정 풀은 동일한 기본 풀을 호출하지만 매개 변수는 다릅니다.
고정 풀 스레드 수는 고정되어 있으며 0 초 유휴 상태입니다 (유휴 없음)
캐시 풀 스레드의 수는 0-Integer.max_value를 지원합니다 (분명히 호스트의 자원 공차는 전혀 고려되지 않음), 60 초 유휴
예제 설명 :
(1)의 주석을 제거하면 실행 결과는 다음과 같습니다.
첫 번째 작업의 첫 번째 시간, 첫 번째 작업 중 세 번째 시간, 두 번째 작업 중 세 번째 시간, 두 번째 작업의 두 번째 시간 중 두 번째 작업 중 세 번째 시간은 두 번째 작업 중 두 번째 시간 중 세 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 세 번째 시간입니다. 두 번째 시간의 두 번째 시간의 두 번째 시간의 두 번째 시간의 두 번째 시간의 두 번째 시간의 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 두 번째 시간 중 네 번째 시간의 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간입니다. 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간이 네 번째 시간입니다. 네 번째의 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간 중 네 번째 시간
고정 크기의 스레드 풀이 3의 용량으로 생성 된 다음 4 개의 작업이 루프에서 실행되었습니다. 출력 결과에서 처음 3 개의 작업이 먼저 실행되고 유휴 스레드가 네 번째 작업을 수행한다는 것을 알 수 있습니다.
4.3SingLethreadExecutor
(3) 댓글을 제거합니다. 다음과 같이 실행 결과를 참조하십시오.
첫 번째 작업의 첫 번째 임무 첫 번째 작업의 첫 번째 임무 첫 번째 임무 첫 번째 임무의 첫 번째 임무의 첫 번째 임무의 첫 번째 임무의 첫 번째 임무의 첫 번째 임무의 첫 번째 임무의 첫 번째 임무의 첫 번째 임무의 첫 번째 작업의 첫 번째 작업의 첫 번째 작업의 첫 번째 작업의 두 번째 작업의 두 번째 작업의 두 번째 작업의 두 번째 작업의 두 번째 작업의 두 번째 작업의 두 번째 작업의 두 번째 작업의 두 번째 작업의 두 번째 작업의 두 번째 작업의 두 번째 작업의 두 번째 작업의 두 번째 작업의 세 번째 작업의 세 번째 작업의 세 번째 작업의 세 번째 작업의 세 번째 작업의 세 번째 작업의 세 번째 작업의 네 번째 작업의 네 번째 작업을 제 4 번째 과제의 네 번째 작업을 제 4 번째 과제의 네 번째 작업을 제 4 번째 작업 중 네 번째 작업 중 4 번째 과제를 제 4 번째 작업 중 네 번째 작업을 제 4 번째 작업 중 네 번째 작업 중 4 번째 과제입니다. 네 번째 임무의 네 번째 임무의 네 번째 임무의 네 번째 과제의 네 번째 과제의 네 번째 임무의 네 번째 과제의 네 번째 과제의 네 번째 과제의 네 번째 과제의 네 번째 임무의 네 번째 임무의 네 번째 과제의 네 번째 임무의 네 번째 임무의 네 번째 임무의 네 번째 임무의 네 번째 임무의 네 번째 임무의 네 번째 과제의 네 번째 과제의 네 번째 작업의 네 번째 작업의 네 번째 작업의 네 번째 작업의 네 번째 작업의 네 번째 작업의 네 번째 과제의 네 번째 작업의 네 번째 작업의 네 번째 작업의 네 번째 작업의 네 번째 작업의 네 번째 과제의 네 번째 과제의 네 번째 과제의 네 번째 작업의 네 번째 과제의 네 번째 과제의 네 번째 과제입니다.
네 가지 작업은 순차적으로 실행됩니다.
4.4 Scheduledthreadpool
ScheduledThreadpool은 고정 크기의 스레드 풀입니다. FixedThreadpool과 유사하게 실행 된 작업은 시간이 정해진 작업입니다.
(4)의 주석을 제거함으로써 얻은 결과는 고정식 풀 풀에 의해 얻은 결과와 동일합니다. Scheduledthreadpool의 주된 이유는 여기가 아니라 시간이 정해진 작업입니다. 다음 예를 참조하십시오.
패키지 스레드; import java.util.concurrent.executors; import java.util.concurrent.scheduledexecutorservice; import java.util.concurrent.timeUnit;/*** 16-7-11의 Yang에 의해 생성되었습니다. */public class myscheduledtask emplements runnable {private String tname; public myscheduledTask (문자열 이름) {this.tname = name; } public void run () {system.out.println (tname+"작업 지연 실행 2 초!"); } public static void main (string [] args) {scheduledexecutorservice scheduledpool = executors.newscheduledthreadpool (2); ScheduleDexecutorService singschedulepool = executors.newsingLethreadScheduledExecutor (); myscheduledtask mt1 = 새로운 myscheduledtask ( "mt1"); myscheduledtask mt2 = 새로운 myscheduledtask ( "mt2"); // ScheduledThreadPool을 사용하여 MT1 작업을 시작하여 ScheduledPool.Schedule (MT1,2, TimeUnit.seconds)을 실행합니다. // SingleScheduledThreadPool로 mt2를 시작합니다. singschedulepool.schedule (Mt2,2000, TimeUnit.milliseconds); scheduledpool.shutdown (); singschedulepool.shutdown (); }}결과:
MT1 작업 실행에 2 초를 지연시킵니다! MT2 작업이 2 초를 지연시킬 수 있습니다!
프로그램이 2 초 동안 실행되면 결과가 표시되지 않으므로 2 초 후에 스레드가 실행되었음을 나타냅니다.
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!