java.util.concurrent 패키지는 다중 스레드 작업에 대한 클래스를 제공합니다. 일반적으로 사용되는 것은 ExecutorService 및 그 구현 클래스 (예 : ThreadPooleExecutor 등), 집행자, 집행자, 미래, 호출 가능 등입니다.
1. ExecutorService (ExecutorService) 인터페이스 : execute (), 제출 (), shutdown (), shutdownnow () 등과 같은 일부 비동기 다중 스레드 작업 메소드를 제공합니다.
2. Executor Interface : 제출 된 작업 (스레드)을 실행하고 하나의 메소드 만 실행 (runnable a)
2. Executors Class : NewXXX (), XXXTHREADFACTORY () 등과 같은 집행자 서브 클래스 및 스레드 변형 등을 운영하는 일부 공장 방법 및 공개 방법을 제공합니다.
3. Futrue 인터페이스 : 스레드 실행 결과를 나타내고 스레드 실행 결과를 얻는 메소드를 제공하고 get (), cancle () 등과 같은 스레드를 취소합니다.
4. 호출 인터페이스 : 리턴 값이있는 스레드는 JDK1.5에 의해 제공되며 새 인터페이스를 실행합니다.
ExecutorService와 미래에 대한 이해에 대한 간단한 기록을 만드십시오.
암호:
공개 클래스 메인 {private static int count = 0; public static void main (String [] args) {list <future> resultList = new LinkedList <> (); /*** executors.newCachedThreadPool () 스레드 캐시 풀 생성. 스레드가 60 년대에 사용되지 않으면 캐시 풀* executors.newscheduledthreadpool ()가 고정 된 용량을 갖는 스레드 풀을 생성하고 정해진 스케줄링 시간* executors에 따라 실행 된 스레드 풀을 만듭니다. 고정 용량* executors가있는 스레드 캐시 풀 (newsedexecutor)가있는 스레드 캐시 풀 (newsingexecutor)가 있습니다. 스레드*/ executorService executorService = executors.newCachedThreadPool (); for (int i = 0; i <10; i ++) {future future = executorService.submit (new Callable <string> () {@override public string call () {try {system.out.println (stride.currentThread (). getName ()); thread.sleep (5000); main.count.out.println (thread.currentthread (). resultlist.add (미래); } executorService.shutdown (); for (future future : resultList) {try {system.out.println (future.get () + ".. is over ..."); } catch (InterruptedException e) {e.printstacktrace (); } catch (executionException e) {e.printstacktrace (); }} system.out.println ( "메인 스레드 엔드 ..."); }}산출:
풀 -1- 스레드 -1pool-1- 스레드 -2pool-1- 스레드 -3pool-1- 스레드 -4pool-1- 스레드 -5pool-1- 스레드 -6pool-1- 스레드 -7pool-1- 스레드 -8pool-1- 스레드 -9pool-1- 스레드 -10pool-1-thread-1..Start 카운트 : ... 0Pool-1- THREAD-2..START 메인 : ... 메인 카운트 : ... 1pool-1-shread-2..end 메인 카운트 : ... 1pool-1-shread-1..end 메인 카운트 : ... 1pool-1-shread-3..end 메인 카운트 : ... 1pool-1-shread-2..end 메인 카운트 : ... 1pool-1- 스레드 -1 .. 엔드 메인 카운트 : ... 1pool-1-thread-3..end 메인 카운트 : ... 2pool-1- the-1-1- 테드 레드 2.IS. Over ... Pool-1-Shread-4..start Main Count : ... 2pool-1-shread-3..IS OVER ... PULL-1-STHREAD-4..END MAIN COUNT : ... 3POOL-1-STHREAD-4..IS ... PULL-1-STHREAD-5..START 메인 카운트 : ... 3POOL-1-THREAD-5..END 메인 카운트 : ... 4POOL-1-THREAD-5..IS OFFER ... PULL-1- THERLED-6. 카운트 : ... 4pool-1-shread-6..end main count : ... 4pool-1-shread-6..end 메인 카운트 : ... 4pool-1-shread-6..end main count : ... 4pool-1-shread-6..end 메인 카운트 : ... 4pool-1-thread-6..end 메인 카운트 : ... 5pool-1-thread-6..is main..Start 메인 : ... 5pool-1-thehtrest-7 .. 카운트 : ... 6pool-1-shread-7..IS OVER ... PULL-1-STHREAD-8 .. Start Main Count : ... 6pool-1-shread-8..end 메인 카운트 : ... 7pool-1-shread-8 .. is ... pool-1-shread-9 .. Start Main Count : ... 7pool-1-shread-9..end 메인 카운트 : ... 8pool-1-thever-thear ... 카운트 : ... 7pool-1-shread-9..end main count : ... 8pool-1-shread-9 .. is over ... pool-1-shread-10..start main count : ... 8pool-1-shread-9 .. is ... pool-1-shread-10 .. start main count : ... 8pool-1- 스레드 -10 .. end 메인 카운트 : ... 9pool-1-1.is main-stride end and the Main-Stread-10 .. 실행
콘솔은 5 초 동안 대기 한 후 위의 출력 결과를 인쇄합니다. 그 이유는 모든 스레드가 시작될 때 동시 작동이며 5 초 동안 기다릴 것입니다. 전반적으로 5 초만 기다린 것 같습니다. 이것은 동시 작업입니다.
요약 :
1. Execute () 메소드와 ExecutorService가 제공 한 제출 () 메소드의 차이 :
에이. execute () 메소드는 실행 가능한 유형의 인스턴스 만 허용하므로 반환 값을 얻을 수 없으며 스레드 실행 상황을 동적으로 얻을 수 없습니다.
비. 제출 () 메소드는 실행 가능하고 호출 가능한 인스턴스를 허용하고 향후 인스턴스를 반환합니다. 향후 인스턴스의 get () 메소드는 스레드 실행 리턴 값을 얻고 스레드 실행 예외를 던질 수 있습니다. 따라서 스레드 실행에 의해 결과를 반환하고 스레드 실행 중에 가능한 예외를 처리하거나 중간에서 스레드 실행을 취소하려는 경우 제출 () 메서드를 사용할 수 있습니다.
2. 출력을 통해 모든 스레드가 실행을 완료 한 후 기본 메소드 (기본 스레드)가 종료되는 것을 알 수 있습니다. 이유 :
에이. 제출 () 메소드를 통해 미래 인스턴스를 가져 와서 미래 인스턴스의 get () 메소드를 통해 스레드 리턴 결과를 얻으십시오. 향후 인스턴스의 get () 메소드는 돌아 오기 전에 스레드가 실행될 때까지 기다릴 것입니다. 따라서 기본 방법은 모든 자식 스레드가 종료되기 전에 기다릴 것입니다.
비. 위의 빨간색으로 표시된 For 루프가 제거되면 모든 자식 스레드가 종료되기를 기다리지 않고 기본 메소드 (기본 스레드)가 일찍 끝납니다.
다시 채우다:
1. 여러 스레드가 동시에 실행되면 스레드 중 하나에서 예외가 발생하고 처리되지 않으면 스레드는 자동으로 실행을 중지하지만 다른 스레드는 여전히 정상적으로 실행됩니다. 이것이 Tomcat 요청에서 예외가 발생할 때 Tomcat이 계속 서비스를 제공 할 수있는 이유입니다.
2. Tomcat은 스레드 풀과 대기 풀을 제공합니다. 각 요청은 새 스레드를 다시 시작하여 요청을 처리합니다. 스레드 풀의 스레드가 소비되면 대기 풀에 넣고 대기합니다. 스레드가 스레드 풀에 다시 릴리스되면 대기 풀에서 요청을 처리하기 위해 스레드가 할당됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.