1. 소개
실 풀을 합리적으로 사용하면 세 가지 이점을 얻을 수 있습니다. 첫째 : 자원 소비를 줄입니다. 생성 된 스레드를 재사용하여 스레드 생성 및 파괴로 인한 소비를 줄입니다. 둘째 : 응답 속도를 향상시킵니다. 작업이 도착하면 스레드가 생성 된 직후 작업을 실행할 수 있습니다. 셋째 : 스레드 관리 가능성을 향상시킵니다. 스레드는 부족한 자원입니다. 무제한으로 만들어지면 시스템 리소스를 소비 할뿐만 아니라 시스템의 안정성을 줄입니다. 스레드 풀을 사용하면 통일 할당, 튜닝 및 모니터링이 될 수 있습니다. 그러나 스레드 풀을 합리적으로 사용하려면 원리를 잘 알고 있어야합니다.
2. 스레드 풀 사용
Executors가 제공하는 네 가지 유형의 스레드 1.NewCachedThreadpool은 캐시 가능한 스레드 풀을 만듭니다. 스레드 풀 길이가 처리 요구를 초과하면 유휴 스레드를 유연하게 재활용 할 수 있습니다. 재활용이 없으면 새 스레드를 만듭니다. 2.NewFixedThreadPool 최대 스레드 동시성을 제어 할 수있는 고정 길이의 스레드 풀이 생성되며 과잉 스레드가 대기열에서 대기합니다. 3.NewScheduledThreadPool 타임 및주기적인 작업 실행을 지원하는 고정 길이의 스레드 풀을 만듭니다. 4.NewsingLethreadExecutor 단일 스레드 스레드 풀을 생성하여 고유 한 작업자 스레드 만 사용하여 작업을 실행하여 모든 작업이 지정된 순서 (FIFO, LIFO, 우선 순위)로 실행되도록합니다.
1.NewCachedthreadpool 캐시 가능한 스레드 풀을 만듭니다. 스레드 풀 길이가 처리 요구를 초과하면 유휴 스레드를 유연하게 재활용 할 수 있습니다. 재활용이 없으면 새 스레드를 만듭니다. 예는 다음과 같습니다
ExecutorService executorService = executors.newCachedThreadPool (); for (int i = 0; i <5; i ++) {최종 int index = i; try {thread.sleep (index * 1000); } catch (InterruptedException e) {e.printstacktrace (); } executorService.execute (new Runnable () {@override public void run () {system.out.println (thread.currentthread (). getName () + "," + index);}});} // 콘솔 정보 풀 -1- 스레드 -1,0pool-1- 스레드 -1,1pool-1- 스레드 -1,2pool-1- 스레드 -1,3pool-1- 스레드 -1,42.NewFixedThreadPool 최대 스레드 동시성을 제어 할 수있는 고정 길이의 스레드 풀이 생성되며 과잉 스레드가 대기열에서 대기합니다. 예는 다음과 같습니다
executorService fixedThreadPool = executors.newfixedThreadPool (4); for (int i = 0; i <5; i ++) {최종 int index = i; fixedthreadpool.execute (new runnable () {@override public void run () {try {system.out.println (ride.currentThread (). getName () + "," + index);} catch (interruptedException e) {e.printstacktrace ();}}}}}}}}}}}}}}} 풀 -1- 스레드 -1,0pool-1- 스레드 -2,1pool-1- 스레드 -3,2pool-1- 스레드 -4,3pool-1- 스레드 -1,43.NewScheduledthreadpool 고정 길이의 스레드 풀을 만듭니다. 지원주기 및 타이밍 작업의 예는 다음과 같습니다.
ScheduleDexecutorService ScheduledThreadPool = Executors.NewScheduledThreadPool (5); System.out.println ( "이전 :" + System.CurrentTimeMillis ()/1000); scheduledthreadpool.schedule (new Runnable () {@override public void run () {system.out.println ( "3 초의 실행 지연 :" + System.CurrentTimeMillis ()/1000), 3, TimeUnit.seconds); System.out.out.println ( "이후 :" +System.CurrentTimeMillis ()/1000); // 콘솔 정보 전 : 1518012703AFTER : 1518012703 3 초의 지연 : 1518012706SYSTEM.out.println ( "이전 :" +System.CurrentTimeMillis ()/1000); {@override public void run () {system.out.println (1 초 지연 후 3 초 안에 한 번 실행됩니다.콘솔 메시지
전 : 1518013024
후 : 1518013024
1 초 지연 후 3 초 안에 한 번 실행 : 1518013025
1 초 지연 후 3 초 안에 한 번 실행 : 1518013028
1 초 지연 후 3 초 안에 한 번 실행 : 1518013031
4. NewsingLethreadExecutor는 단일 스레드 스레드 풀을 만듭니다.이 스레드 풀은 작업자 스레드 만 사용하여 작업을 실행하여 주문을 보장합니다. 예는 다음과 같습니다
executorService singlethreadexecutor = executors.newsingLethreadExecutor (); for (int i = 0; i <10; i ++) {최종 int index = i; SingleTheRedexecutor.Execute (new Runnable () {@override public void run () {try {system.out.println (thread.currentthread (). getName () + "," + index);} catch (interruptedException e) {e.printstacktrace ()}}}});콘솔 정보
풀 -1- 스레드 -1,0
풀 -1- 스레드 -1,1
풀 -1- 스레드 -1,2
풀 -1- 스레드 -1,3
풀 -1- 스레드 -1,4
스레드 풀에 작업을 제출하십시오. ThreadPoolexexecutor 클래스에서 Execute () 및 elbout ()의 차이점은 실제로 집행자에서 선언 된 메소드입니다. ThreadPooleExecutor에서 구현됩니다. 이 방법은 ThreadPooleExecutor의 핵심 방법입니다. 이 방법을 통해 작업을 스레드 풀에 제출하고 실행을 위해 스레드 풀에 넘겨 줄 수 있습니다.
제출 () 메소드는 executorService에서 선언 된 메소드입니다. AbstractExecutorService에서 구현되었습니다. ThreadPooleExecutor에 다시 작성되지는 않습니다. 이 방법은 또한 스레드 풀에 작업을 제출하는 데 사용됩니다. 그러나 execute () 메소드와 다릅니다. 작업 실행 결과를 반환 할 수 있습니다. 소스 코드를 통해 제출 () 메소드의 구현을 확인하면 실제로 실행 된 () 메소드가 호출되지만 미래를 사용하여 작업의 실행 결과를 얻습니다.
/** * @Throws RejectedExecutionException {@InheritDoc} * @Throws nullPointerException {@InheritDoc} */public future <?> 제출 (runnable task) {if (task == null) throw new nullpointerexception (); runnableFuture <void> ftask = newtaskfor (task, null); 실행 (ftask); 반환 ftask;}스레드 풀의 닫기 스레드 풀의 종료 또는 종료 방법을 호출하여 스레드 풀을 닫을 수 있지만 구현 원칙은 다릅니다. 종료 원칙은 스레드 풀의 상태를 종료 상태로 간단히 설정 한 다음 작업을 실행하지 않는 모든 스레드를 방해하는 것입니다. ShutdownNow의 원리는 스레드 풀에서 작업자 스레드를 통과 한 다음 스레드의 인터럽트 메소드를 하나씩 호출하여 스레드를 중단하는 것입니다. 따라서 인터럽트에 응답 할 수없는 작업은 결코 종료되지 않을 수 있습니다. ShutdownNow는 먼저 스레드 풀의 상태를 중지하도록 설정 한 다음 작업을 실행하거나 일시 중지하는 모든 스레드를 중지하고 작업이 실행되기를 기다리는 목록으로 돌아갑니다.
이 두 마감 방법 중 하나가 호출되는 한 isshutdown 방법이 True를 반환합니다. 모든 작업이 닫히면 스레드 풀이 성공적으로 닫혀 있음을 의미합니다. Isterminaed 방법을 호출하면 True가 반환됩니다. 스레드 풀을 닫기 위해 호출 해야하는 방법은 스레드 풀에 제출 된 작업 특성에 따라 결정해야합니다. 일반적으로 스레드 풀을 닫으려면 셧다운이 호출됩니다. 작업을 실행할 필요가 없으면 ShutdownNow를 호출 할 수 있습니다.
3. 스레드 풀 분석
프로세스 분석 : 스레드 풀의 주요 워크 플로우는 아래 그림에 나와 있습니다 : Java 스레드 풀의 주요 워크 플로우
위의 그림에서 우리는 스레드 풀에 새 작업을 제출할 때 스레드 풀의 처리 흐름이 다음과 같습니다.
** 소스 코드 분석. ** 위의 프로세스 분석을 통해 스레드 풀의 작동 원리를 직관적으로 이해할 수 있습니다. 소스 코드를 사용하여 구현 방법을 확인하십시오. 스레드 풀은 다음과 같이 작업을 실행합니다.
public void execute (runnable 명령) {if (command == null) 던지기 nullpointerexception (); int c = ctl.get (); if (workercountof (c) <corepoolsize) {if (addworker (command, true)) return; c = ctl.get (); } if (isrunning (c) && workqueue.offer (command)) {int recheck = ctl.get (); if (! isrunning (다시 확인) && remain (command)) Reject (명령); else if (workercountof (다시 확인) == 0) addWorker (null, false); } else if (! addWorker (command, false)) Reject (명령);} 작업자 스레드. 스레드 풀이 스레드를 생성하면 스레드를 작업자 스레드로 캡슐화합니다. 작업자가 작업을 실행 한 후에는 작업 대기열에서 작업을 실행할 수 있도록 무한히 루프됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.