이 기사는 참조를 위해 4 개의 Java 스레드 풀 사용을 분석합니다. 특정 내용은 다음과 같습니다
1. 새로운 스레드의 단점
비동기 작업을 실행할 때 여전히 다음과 같이 새 스레드를 수행합니까?
새 스레드 (new Runnable () {@override public void run () {// todo 자동 생성 메소드 스텁}). start ();그러면 너무 많은 아웃이있을 것입니다. 새로운 스레드의 단점은 다음과 같습니다.
에이. 새로운 스레드의 성능은 매번 열악합니다.
비. 스레드에는 통일 된 관리가 부족하여 제한없이 새로운 스레드를 생성하고 서로 경쟁 할 수 있으며 충돌이나 OOM을 유발하기 위해 너무 많은 시스템 리소스를 차지할 수 있습니다.
기음. 시간이 정한 실행,주기 실행, 스레드 인터럽트와 같은 더 많은 기능이 부족합니다.
새 스레드와 비교하여 Java가 제공하는 4 개의 스레드 풀의 장점은 다음과 같습니다.
에이. 기존 스레드를 재사용하여 객체 생성 및 멸종의 오버 헤드를 줄이고 잘 수행하십시오.
비. 최대 동시 스레드 수를 효과적으로 제어하고 시스템 리소스의 활용률을 향상 시키며 과도한 자원 경쟁을 피하고 막힘을 피할 수 있습니다.
기음. 시간이 지정된 실행, 정기 실행, 단일 스레딩, 동시 번호 제어 등과 같은 기능을 제공합니다.
2. Java 스레드 풀
Java는 집행자를 통해 4 가지 유형의 스레드 풀을 제공합니다.
NewCachedthreadpool은 캐시 가능한 스레드 풀을 만듭니다. 스레드 풀 길이가 처리 요구를 초과하면 유휴 스레드를 유연하게 재활용 할 수 있습니다. 재활용이 없으면 새 스레드를 만듭니다.
NewFixedThreadpool 최대 스레드 동시성을 제어 할 수있는 고정 길이의 스레드 풀이 생성되며 과잉 스레드가 대기열에서 대기합니다.
NewsCheduledthreadpool은 시간이 지정되고 정기적 인 작업 실행을 지원하는 고정 길이 스레드 풀을 만듭니다.
NewsingLethreadExecutor는 단일 스레드 스레드 풀을 만듭니다.이 스레드 풀은 고유 한 작업자 스레드 만 사용하여 작업을 실행하여 모든 작업이 지정된 순서 (FIFO, LIFO, 우선 순위)로 실행되도록합니다.
(1) NewCachedthreadpool :
캐시 가능한 스레드 풀을 만듭니다. 스레드 풀 길이가 처리 요구를 초과하면 유휴 스레드를 유연하게 재활용 할 수 있습니다. 재활용이 없으면 새 스레드를 만듭니다. 샘플 코드는 다음과 같습니다.
ExecutorService CachedThreadPool = Executor.NewCachedThreadPool (); for (int i = 0; i <10; i ++) {최종 int index = i; try {thread.sleep (index * 1000); } catch (InterruptedException e) {e.printstacktrace (); } cachedThreadPool.Execute (new Runnable () {@OverRidePublic void run () {System.out.println (index);}});}스레드 풀이 무한합니다. 두 번째 작업이 실행되면 첫 번째 작업이 완료되었으며 첫 번째 작업을 실행하는 스레드는 매번 새 스레드를 작성하지 않고 재사용됩니다.
(2) NewFixedThreadpool :
최대 스레드 동시 동시성을 제어 할 수있는 고정 길이의 스레드 풀을 만듭니다. 과잉 스레드가 대기열에서 대기합니다. 샘플 코드는 다음과 같습니다.
ExecutorService FixedThreadPool = Executor.NewFixedThreadPool (3); for (int i = 0; i <10; i ++) {최종 int index = i; fixedthreadpool.execute (new runnable () {@overridepublic void run () {try {system.out.println (index); thread.sleep (2000);} catch (InterruptedException e) {// to auto-auto-auto-auto-genated catch e.printstacktrace ();}});});스레드 풀 크기는 3이기 때문에 각 작업 출력 인덱스 후 2 초 후에 수면 2 초이므로 2 초마다 3 개의 숫자가 인쇄됩니다.
고정 길이 스레드 풀의 크기는 시스템 리소스에 따라 가장 잘 설정됩니다. runtime.getRuntime (). Preloaddatacache를 참조하십시오.
(3) NewsCheduledthreadpool :
시간이 지정되고 정기적 인 작업 실행을 지원하는 고정 길이 스레드 풀을 만듭니다. 지연 실행에 대한 샘플 코드는 다음과 같습니다.
ScheduleDexecutorService ScheduledThreadPool = Executor.NewScheduledThreadPool (5); scheduledthreadpool.schedule (new runnable () {@overridepublic void run () {system.out.println ( "Delay 3 Seenss");}}, 3, timeUnit.seconds);지연 실행이 3 초를 나타냅니다.
샘플 코드는 다음과 같이 정기적으로 실행됩니다.
scheduledthreadpool.scheduleatfixedrate (new Runnable () {@overridepublic void run () {system.out.println ( "3 초마다 1 초마다, 3 초마다 c이는 지연이 1 초 후에 3 초마다 수행됨을 의미합니다.
ScheduleDexecutorService는 타이머보다 더 안전하고 강력합니다
(4) NewsingLethreadExecutor :
단일 스레드 스레드 풀을 만듭니다. 고유 한 작업자 스레드 만 사용하여 작업을 실행하여 모든 작업이 지정된 순서 (FIFO, LIFO, 우선 순위)로 실행되도록합니다. 샘플 코드는 다음과 같습니다.
executorService singlethreadexecutor = executors.newsingLethreadExecutor (); for (int i = 0; i <10; i ++) {최종 int index = i; singlethreadexecutor.execute (new runnable () {@overridepublic void run () {system.out.println (200); (InterruptedException e) {// todo 자동 생성 캐치 블록 e.printstacktrace ();};결과는 순서대로 출력되며, 이는 각 작업을 순서대로 실행하는 것과 같습니다.
대부분의 현재 GUI 프로그램은 단일 스레드입니다. Android의 단일 스레드는 데이터베이스 작업, 파일 작업, 응용 프로그램의 배치 설치, 응용 프로그램의 배치 삭제 등에 사용될 수 있으며 동시에 적합하지 않지만 IO를 차단하고 UI 스레드의 응답에 영향을 줄 수 있습니다.
스레드 풀의 기능 :
스레드 풀의 기능은 시스템에서 실행 된 스레드 수를 제한하는 것입니다.
시스템 환경에 따라 스레드 수는 최상의 작업 효과를 달성하기 위해 자동 또는 수동으로 설정할 수 있습니다. 더 적은 시스템 리소스가 낭비되고 더 많은 시스템 정체가 높지 않습니다. 스레드 풀을 사용하여 스레드 수를 제어하고 다른 스레드가 줄을 서서 기다리고 있습니다. 작업이 실행 된 후 첫 번째 작업은 큐에서 가져와 실행을 시작합니다. 대기열에 대기 프로세스가 없으면 스레드 풀 의이 자원이 대기 중입니다. 새 작업을 실행 해야하는 경우 스레드 풀에 대기 작업자 스레드가 있으면 실행을 시작할 수 있습니다. 그렇지 않으면 대기 대기열에 들어갑니다.
스레드 풀을 사용하는 이유 :
1. 스레드가 생성되고 파괴되는 횟수를 줄이고 각 작업자 스레드를 재사용하여 여러 작업을 수행 할 수 있습니다.
2. 스레드 풀의 작업자 스레드의 수는 메모리 소비로 인해 과도한 메모리 소비로 인해 서버가 빨려 들어가는 것을 방지하는 시스템의 능력에 따라 조정할 수 있습니다 (각 스레드에는 약 1MB의 메모리가 필요합니다. 스레드가 더 많을수록 메모리가 더 커지고 최종적으로 충돌이 발생합니다.
Java에있는 스레드 풀의 최상위 인터페이스는 집행자이지만 엄격하게 말하면 실행자는 스레드 풀이 아니라 스레드를 실행하기위한 도구 일뿐입니다. 실제 스레드 풀 인터페이스는 ExecutorService입니다.
몇 가지 더 중요한 범주 :
ExecutorService : 진정한 스레드 풀 인터페이스.
ScheduleDexecutorService : 타이머/타이머 스탁과 유사하여 반복되는 작업이 필요한 문제를 해결할 수 있습니다.
ThreadPooleExecutor : ExecutorService의 기본 구현.
ScheduledThreadPooleExecutor : ScheduleDexecutorService 인터페이스의 클래스 구현,주기적인 작업 스케줄링 클래스 구현 인 ThreadPooleExecutor를 상속하는 클래스 구현.
특히 스레드 풀의 원리가 명확하지 않은 경우 스레드 풀을 구성하는 것이 매우 복잡합니다. 구성된 스레드 풀이 더 나을 가능성이 높습니다. 따라서 일부 정적 공장은 집행자 클래스에 제공되어 일반적으로 사용되는 스레드 풀을 생성합니다.
1. NewsingLethreadExecutor
단일 스레드 풀을 만듭니다. 이 스레드 풀에는 하나의 스레드가 작동하는데, 이는 일련의 모든 작업을 수행하는 단일 스레드와 동일합니다. 이 고유 한 스레드가 예외로 인해 종료되면 교체 할 새로운 스레드가 있습니다. 이 스레드 풀은 모든 작업의 실행 순서가 작업 제출 순서대로 실행되도록합니다.
2.NewFixedThreadPool
고정 크기 스레드 풀을 만듭니다. 작업이 제출 될 때마다 스레드가 스레드 풀의 최대 크기에 도달 할 때까지 스레드가 생성됩니다. 스레드 풀 크기는 최대 값에 도달하면 동일하게 유지됩니다. 실행 예외로 인해 스레드가 종료되면 스레드 풀이 새 스레드를 추가합니다.
3.NewCachedthreadpool
캐시 가능한 스레드 풀을 만듭니다. 스레드 풀 크기가 작업을 처리하는 데 필요한 스레드를 초과하는 경우
그러면 일부 유휴 스레드 (60 초 안에 작업 실행 없음)가 재활용됩니다. 작업 횟수가 증가하면이 스레드 풀은 작업을 처리하기 위해 새 스레드를 지능적으로 추가 할 수 있습니다. 이 스레드 풀은 스레드 풀 크기를 제한하지 않으며, 이는 운영 체제 (또는 JVM)가 생성 할 수있는 최대 스레드 크기에 전적으로 의존합니다.
4. NewScheduledthreadpool
무제한 크기의 스레드 풀을 만듭니다. 이 스레드 풀은 주기적으로 주기적으로 작업을 수행 할 필요성을 지원합니다.
예제 코드
1. 고정 크기 스레드 풀, NewFixedThreadpool :
패키지 app.executors; java.util.concurrent.executors import; import java.util.concurrent.executorservice; / ** * java 스레드 : 스레드 풀 * * @author xiho */ public class test {public static void main (String [] args) {// 고정 된 수의 재사용 가능한 스레드가있는 스레드 풀 생성 executorService pool = executors.newfixedThreadPool (2); // 스레드 만들기 스레드 생성 t1 = new Mythread (); 스레드 t2 = new Mythread (); 스레드 t3 = new Mythread (); 스레드 t4 = new Mythread (); 스레드 t5 = new Mythread (); // 실행 풀을 위해 실을 풀에 넣습니다 .Execute (t1); Pool.Execute (T2); Pool.Execute (T3); Pool.Execute (T4); Pool.Execute (T5); // 스레드 풀 풀을 닫습니다 .Shutdown (); }} class mythread는 스레드 {@override public void run () {system.out.println (thread.currentthread (). getName () + "실행 ..."); }}출력 결과 :
풀 -1- 스레드 -1이 실행 중입니다. . . Pool-1-Shread-3이 실행 중입니다. . . Pool-1-Shread-4가 실행 중입니다. . . 풀 -1- 스레드 -2가 실행 중입니다. . . 풀 -1- 스레드 -5가 실행 중입니다. . .
ExecutorService Pool = Executors.newFixedThreadPool (5)에서 매개 변수를 변경하십시오. ExecutorService Pool = Executor.NewFixedThreadPool (2) 및 출력 결과는 다음과 같습니다.
풀 -1- 스레드 -1이 실행 중입니다. . . 풀 -1- 스레드 -1이 실행 중입니다. . . 풀 -1- 스레드 -2가 실행 중입니다. . . 풀 -1- 스레드 -1이 실행 중입니다. . . 풀 -1- 스레드 -2가 실행 중입니다. . .
위의 결과에서 NewFixedThreadpool의 매개 변수가 실행할 수있는 최대 스레드 수를 지정한다는 것을 알 수 있습니다. 이 스레드 수보다 더 많이 추가하면 실행되지 않습니다. 둘째, 스레드 풀에 추가 된 스레드는 관리 된 상태에 있으며 스레드의 작동은 결합 순서의 영향을받지 않습니다.
2. 단일 작업 스레드 풀, NewsingLethreadExecutor :
executorService 풀 = executors.newfixedThreadPool (2) 위의 코드에서 ExecutOrService 풀 = executors.newsingLetHreadExecutor ()를 변경하십시오.
출력 결과 :
풀 -1- 스레드 -1이 실행 중입니다. . . 풀 -1- 스레드 -1이 실행 중입니다. . . 풀 -1- 스레드 -1이 실행 중입니다. . . 풀 -1- 스레드 -1이 실행 중입니다. . . 풀 -1- 스레드 -1이 실행 중입니다. . .
실행 메소드를 호출 할 때마다 스레드 -1 런 메소드가 실제로 결국 호출된다는 것을 알 수 있습니다.
3. 가변 크기 스레드 풀, NewCachedthreadpool :
위와 마찬가지로 풀이 생성되는 방식을 변경하십시오.
출력 결과 :
풀 -1- 스레드 -1이 실행 중입니다. . . 풀 -1- 스레드 -2가 실행 중입니다. . . Pool-1-Shread-4가 실행 중입니다. . . Pool-1-Shread-3이 실행 중입니다. . . 풀 -1- 스레드 -5가 실행 중입니다. . .
이 방법은 새로운 스레드 풀이 필요에 따라 생성 될 수 있다는 사실을 특징으로하지만, 이전에 구성된 스레드를 사용할 수있을 때 재사용됩니다.
4. 연결 풀, NewsCheduledthreadpool : 지연 :
공개 클래스 testscheduledthreadpoolexecutor {public static void main (String [] args) {scheduledThreadPooleExecutor exec = new ScheduledThreadPooleExecutor (1); exec.scheduleatfixedrate (new Runnable () {// 예외는 가끔씩 @override publicvoid run () {// 새로운 runtimeexception (); System.out.println ( "============================================================================================================================== ============================================================================================================= ============================================================================================================= ============================================================================================================= TimeUnit.milliseconds); Scheduleatfixedrate (new Runnable () {// 두 사람이 서로 @override publicvoid run ()에 영향을 미치지 않음을 증명합니다.출력 결과 :
================= 83844444444951683864382903483838643830710 ================= 8390643851383926438793198400643939383939383939383939393939393939393939393939393939393939393939393939393939393939393939
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.