스레드 풀은 작업을 병렬로 수집하기위한 실용적인 도구입니다. 응용 프로그램 병렬화에 적합한 멀티 코어 아키텍처의 도입으로 스레드 풀의 역할이 점점 더 명백 해지고 있습니다. ThreadPooleExecutor 클래스 및 기타 보조 클래스를 통해 Java 5는이 프레임 워크를 새로운 동시성 지원 섹션으로 도입했습니다.
ThreadPooleExecutor 프레임 워크는 유연하고 강력합니다. 사용자 별 구성을 지원하고 전체 대기열을 처리하기 위해 관련 후크 및 포화 정책을 제공합니다.
Java Thread Pool은 제출 된 작업을 먼저 작업 대기열에 배치하여 작업 대기열에서 가져옵니다 (생산자가 직접 작업 스레드에 제출합니다). 그런 다음 작업 대기열에 대한 두 가지 구현 전략이 있습니다 : 무한 대기열과 경계 대기열. 무한 큐의 채도에 문제가 없지만, 요청이 계속 높아질 때 작업이 작업 대기열에 두뇌로 추가되어 메모리 및 기타 리소스가 오버플로 또는 배기 될 수 있다는 것입니다. 경계 대기열은 높은 부하로 인한 메모리 소진을 유발하지 않지만 작업 대기열이 가득 차면 새로 제출 된 작업을 관리하는 방법에 대한 문제가 있습니다. 이것은 스레드 풀 작업 큐 포화 전략이 해결 해야하는 문제입니다.
포화 전략은 전략, Callerruns 전략, 전략 폐기 및 Discardolds 전략으로 나뉩니다.
더 잘 이해하기 위해 나는 작은 예를 썼습니다.
패키지 동시성 .pool; import java.util.concurrent.linkedBlockingdequ; import java.util.concurrent.rejectedExecutionHandler; import java.util.concurrent.threadpoolexecutor; import java.util.concurrent.timeUnit; public classepolicy {swall sue eLW, the Suled worl 다른 포화 정책* @param 핸들러 스레드 풀 작업 대기열 포화 정책*/public static void 정책 (RejectedExecutionAndler handler) {// 2 개의 기본 스레드가 있으며, 최대 스레드 수는 3이고 작업 용량 용량은 5입니다. linkedBlockingDeque <> (5)); if (handler! = null) {exec.setRejectedExecutionHandler (handler); // 채도 정책} (int i = 0; i <10; i ++) {exec.submit (new task ()); // 제출} exec.shutdown (); vublic void (string) {args (args) {args (args) {args). ThreadPoolexecutor.abortPolicy ()); // 정책 ((새로운 ThreadPoolexecutor.callerRunspolicy ())); // 정책 (new ThreadPoolexecutor.discardPolicy ()); // 정책 (new ThreadPoolecutor.discardOldestPolicy ());}); id = 0; // task id public task () {id = ++ count;}@public void run () {try {timeUnit.seconds.sleep (3); // 3 초} catch (InterpruptedException e) {System.err.println ( "스레드가 중단되었습니다" + e. 작업자 스레드 : " + 스레드. 작업 대기열이 가득 차면 다른 전략은 다음과 같이 처리됩니다.
1. 정책 : 기본 정책. 새로운 작업이 제출되면 확인되지 않은 예외가 직접 던져집니다. 발신자가 예외를 잡을 수 있습니다.
기본 기능에 다음 코드를 추가하십시오.
정책 (New ThreadPoolexecutor.abortPolicy ());
작동 결과는 다음과 같습니다.
이 프로그램은 거부 예측 지출을 던지고 총 8 개의 작업이 실행됩니다 (스레드 풀은 처음에 3 개의 작업을 실행할 수 있으며 5 개의 대기열은 작업 대기열에 저장됩니다). 작업 대기열이 가득 차면 예외가 직접 던져지고 JVM은 종료되지 않습니다 (지금 왜 그런지 모르겠습니다). 작업을 실행하는 모든 스레드는 스레드 풀의 스레드임을 알 수 있습니다.
2. Callerruns 전략 : 조정 메커니즘의 경우, 작업을 포기하거나 예외를 제외하지 않지만 발신자에게 떨어집니다. 새로운 작업은 스레드 풀에서 실행되는 것이 아니라 외출을 호출하는 스레드에서 실행됩니다.
주요 기능에서 실행 :
정책 ((New ThreadPoolexecutor.callerRunspolicy ());
실행 결과
모든 작업이 실행되며 기본 스레드에서 2 (10-3-5) 작업이 성공적으로 실행되며 스레드 풀의 스레드에 의해 8 개의 작업이 실행됩니다.
3. DISCARD 전략 : 새로 제출 된 작업이 버려집니다.
주요 기능으로 실행하십시오
정책 (New ThreadPoolexecutor.discardPolicy ());
위의 결과는 예외가 발생하지 않고 나중에 제출 된 2 개의 새로운 작업이 폐기되며 처음 8 (3+5) 작업 만 처리되고 JVM은 종료됩니다.
4. DISCARDOLDEST 전략 : 대기열은 "팀의 책임자"의 작업이며 새로운 작업을 제출하려고 노력합니다. (우선 순위 대기열로 작업 대기열 시나리오에 적합하지 않음)
기본 기능에서 다음 방법을 실행하십시오
정책 (New ThreadPoolexecutor.DiscardOldEStPolicy ());
실행 결과 : 총 8 개의 작업이 실행됩니다. 프로그램이 끝납니다. 나중에 추가 된 작업은 9와 10이며 이전 작업 3과 4는 폐기됩니다.
요약
위는 Java 스레드 풀 작업 큐 포화 전략의 코드 예제에 대한이 기사의 전체 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다.