자바 기초 - <스레드 풀>

 

 

 

1. 인터페이스 집행자


무효 (Runnable를 명령)을 실행
미래의 어느 시점에 주어진 명령을 실행합니다.

2.接口공용 인터페이스의 ExecutorService를가 확장  집행자를


(Runnable를 작업) 제출
실행 용의 Runnable 태스크를 송신 작업 미래의 표현을 반환합니다.
(호출 가능 <T> 작업)을 제출
작업을 수행하기위한 반환 값을 제출, 미래의 보류중인 결과를 나타내는 작업으로 돌아갑니다.
(컬렉션 <? 호출 가능 <T 확장 >> 작업을) invokeAll을
주어진 작업 실행, 모든 작업이 완료되면, 상태와 미래의 목록의 결과를 유지하기 위해 돌아갑니다.
종료 ()
, 순서대로 종료를 시작 이전에 제출 한 작업을 수행하지만 새 작업을 허용하지 않습니다.
목록은 <Runnable를> shutdownNow의 ()
실행 중의 액티브 한 태스크 모든 정지를 시도해 작업이 기다리고 처리를 정지 해, 실행을 대기 태스크의리스트를 돌려줍니다.

 


3.接口공용 인터페이스 ScheduledExecutorService를가 확장 ExecutorService를을

ExecutorService를는 지정된 지연 시간 후, 또는 주기적으로 배치 될 실행 명령한다.

 


4,抽象类공공 추상 클래스 AbstractExecutorService는 구현 ExecutorService를을

 

스레드 풀 클래스 클래스 공개 있는 ThreadPoolExecutor (가) 확장 에 AbstractExecutorService을

코어 및 최대 풀 크기
새 작업 제출 방법에 (인 java.lang.Runnable)을 실행
스레드가 요청을 처리하기 위해 새로운 쓰레드를 생성, corePoolSize를보다 적은 실행하면 다른 작업자 스레드가 유휴 상태 인 경우에도.
스레드가 maximumPoolSize를보다 corePoolSize를보다 더 적은를 실행하는 경우 대기열이 꽉 찬 경우 새 스레드를 만들 때 만 (유휴 우선 순위의 스레드를 사용하여 유휴 스레드가 새 스레드를 만들 수 없었다있다).
corePoolSize를하고 maximumPoolSize를 설정 같은 경우, 고정 된 크기의 스레드 풀을 만들 수 있습니다.
maximumPoolSize를 실질적으로 무제한의 설정 값 (예를 들면에 Integer.MAX_VALUE) 경우, 풀 동시 작업의 수를 적응시킨다.

새 스레드 만들기
새 스레드를 생성하는 ThreadFactory를 사용하여. 달리 지정하지 않으면, 다음 같은 쓰레드 그룹에 항상 (이) 쓰레드를 생성, Executors.defaultThreadFactory을 사용
하고 이러한 스레드가 같은 NORM_PRIORITY 우선 순위와 비 데몬 상태를 가지고있다.
다른 ThreadFactory를 제공함으로써, 당신은 그래서 스레드, 스레드 그룹, 우선 순위, 데몬 상태의 이름을 변경할 수 있습니다.
널 (null)이 newThread 스레드에서 반환되는 경우 ThreadFactory를 생성에 실패, 프로그램의 실행은 계속 실행됩니다,하지만 당신은 모든 작업을 수행 할 수 없습니다.

살아 유지
풀이 현재 corePoolSize를 스레드 이상이있는 경우, 이러한 추가 스레드 풀은 비활성 상태 일 때 자원 소비를 줄일 수있는 방법을 제공이 KeepAliveTime, 이상 때 유휴 종료됩니다.
효과적으로 이전의 종료 전에 유휴 상태에서 스레드를 해제 값로부터 Long.MAX_VALUE의 TimeUnit.NANOSECONDS를 사용하여 마감했다.

 

方法:
공공에 ThreadPoolExecutor (INT corePoolSize를,
INT maximumPoolSize를,
긴 KeepaliveTime은,
TimeUnit와 유닛
의 BlockingQueue <Runnable를>이 Workqueue)

초기 파라미터 및 디폴트의 thread 팩토리 감안할 때 거부 실행 핸들러를 사용해, 새로운 ThreadPoolExecutor를 작성합니다. 훨씬 더 편리 보편적 인 생성자를 사용하는 것보다 실행 프로그램 공장의 방법 중 하나를 사용합니다.

: 파라미터
스레드의 수는 유휴 스레드를 포함하여 풀에 유지 - corePoolSize를합니다.
maximumPoolSize를 - 풀에서 허용되는 스레드의 최대 수입니다.
이 KeepAliveTime는 - 스레드의 수가 코어보다 많은 경우,이 새 작업 긴 시간을 기다리고 초과 유휴 스레드 전에 종료됩니다.
단위 - 시간 단위이 KeepAliveTime 매개 변수를 설정합니다.
이 Workqueue - 작업을 수행하기 전에 큐를 유지합니다. 이 큐는 execute 메소드에 의해 제출 된 Runnable 작업을 보유하고 있습니다.

 

allowCoreThreadTimeOut (부울 값)
스레드 코어 및 비 핵심 스레드 작업 시간 제한이 KeepAliveTime 시간을 설정합니다.

종료
새로운 스레드를 적용하고 폐쇄 스레드를 실행하기 전에 기다려야 제출하지

shutdownNow의
직접 모든 스레드의 활성 상태를 해제하고 대기중인 스레드로 돌아

 

클래스 6.public 로 스케줄 는 확장 가능한 ThreadPoolExecutor 구현 ScheduledExecutorService를

일정 (<?>의 Runnable 명령은 공용 A 주택의 ScheduledFuture
, 긴 지연, TimeUnit와 단위)
지정된 지연 시간에 도달 한 후, 작업을 수행합니다. 여기 들어오는 작업) (그래서, Runnable를 구현하는 결과가 ScheduledFuture.get으로 널 가져옵니다

공공 <V>의 ScheduledFuture <V> 일정 (주는, Callable <V> 호출 가능,
긴 지연, TimeUnit와 단위)
주어진 확장까지 시간이 시간 이후, 작업을 수행합니다. 여기에 호출 인터페이스를 들어오는 달성의 작업은, 그래서 반환은 작업의 최종 결과입니다

공용 A 주택의 ScheduledFuture 그 scheduleAtFixedRate (Runnable를 명령, <?>
롱 initialDelay의,
긴 기간,
TimeUnit와 단위)
지난 후 시작하는 작업보다 더 많은 시간을 시간, 작업이 완료되면 시간의 실행 기간이 완료되었는지 여부를 작업의 검출은 작업이 완료되지 않은 경우 현재 작업 실행 즉시, 우리는 작업을 즉시 실행을 완료 한 후 기다릴 필요

공공 scheduleWithFixedDelay의 ScheduledFuture (Runnable를 명령을, <?>
롱 initialDelay의,
긴 지연,
TimeUnit와 단위)
는 지연 시간 initialDelay의에 도달하면 작업이 시작되었습니다. 작업의 완료가 지연 다음에 태스크 실행 중간 지연 간격에 대해 수행 될 후. 이러한 방식으로,주기적인 작업.

 


클래스 7 : 실행자

ExecutorService를 정적 인 newFixedThreadPool (INT nThreads)
// 생성 고정 크기 스레드 풀 (코어 스레드 수와 동일한 스레드의 최대 수)

정적 ExecutorService를 newCachedThreadPool (ThreadFactory를 ThreadFactory를)은
스레드 풀은 새 스레드를 만들어야 할 수 있습니다 만들 수 있습니다,하지만 그들은 이전에 구성된 스레드 사용할 수 및 ThreadFactory를 제공하는 사용하기 위해 필요한 경우 새 스레드를 만드는 방법을 다시 사용합니다.

정적 ExecutorService를 newSingleThreadExecutor ()
(1이다 스레드 코어 수와 스레드의 최대 수)는 단일 스레드 풀 스레드를 만드는

ScheduledExecutorService를 정적 인 newScheduledThreadPool (INT의 corePoolSize를)
고정 된 크기의 스레드 풀을 생성하는이 (코어 파라미터 스레드의 수를 감안할 INT의 최대 값 스레드의 최대 수)


= Executors.newCachedThreadPool ExecutorService를 ();
// 무제한 긴 스레드 풀을 생성 (코어 끈 수가 스레드의 최대 개수는 최대 INT, 0)

 

 

ExecutorsTest 클래스 {공공 
    문자열 TAG = "ExecutorsTest"; 

    반환 값 // 호출 가능 스레드 얻을 
     무효 startThreadPool () {공공 
         ; SumCallable sumCallable = 새로운 새로운 SumCallable () 
         // 핵심 매개 변수 스레드 수 주어진 고정 된 크기의 스레드 풀을 (생성, 최대 스레드 INT 최대 수) 
         ExecutorService를 Executors.newCachedThreadPool 실행자 = (); 
         미래 <정수> = executors.submit 미래 (sumCallable) 
         은 try { 
             방법을 차단하는 것은 //future.get 
             Log.e (TAG "SUM1 =" + 하는 Future.get ()); 
         } 캐치 (예외 E) { 
             e.printStackTrace (); 
         } 
     } 

    // 반환 값은 실행 가능하지 않습니다 
    공공 무효 startThreadPool2 () { 
        SumRunnable sumCallable = 새로운 SumRunnable (); 
        // (파라미터의 최대 int와 스레드의 최대 수와 같은 고정 철심 스레드) 스레드 풀 고정 길이 만들기 
        ExecutorService를 실행자 = Executors.newScheduledThreadPool (20 임); 
        executors.submit (sumCallable를) 
    } 

    // 태스크의 실행이 지연 
    공공 무효 startThreadPool3 () { 
        SumRunnable sumCallable 새로운 새 SumRunnable을 = (); 
        // (코어 파라미터 스레드의 수, INT의 최대 값 스레드의 최대 개수를 지정)이 고정 된 크기의 스레드 풀을 생성 
        ScheduledExecutorService를 실행 프로그램 = Executors.newScheduledThreadPool (100) 
        executors.schedule (sumCallable, 3 TimeUnit.SECONDS) 
        ; Log.e (태그는 "세가지 초 후에 행하는") 
    } 

    실행 가능한 아닌 값을 반환 // 
    공개 무효 startThreadPool4 () { 
        SumRunnable sumCallable = 새로운 새 SumRunnable ();
        // (파라미터의 최대 int와 스레드의 최대 수와 같은 고정 철심 스레드) 스레드 풀 고정 길이를 만들기 
            Log.e (태그, "SUM ="SUM +);
        ExecutorService를 실행기 = Executors.newCachedThreadPool (새 ThreadFactoryTest ()); 
        executors.submit (sumCallable); 
    } 



    공용 클래스 SumRunnable는 Runnable를 {구현 
        @Override 
        공공 무효 실행 () { 
            ( "开始执行", TAG) Log.e을; 
            INT 합 = 0; 
            대 (INT에서 K = 0; K <100; 케이 ++) { 
                합계 = K +; 
                {시도 
                    에 Thread.sleep (30); 
                } 캐치 (예외 : InterruptedException 전자) { 
                    e.printStackTrace (); 
                } 
            } 
        } 
    } 

    공용 클래스 SumCallable는 {호출 가능 <정수> 구현
        @Override 
        공개 정수 () 호출은 예외가 발생 { 
            INT 합 = 0; 
            대 (INT에서 K = 0; K <100; 케이 ++) { 
                합계 = K +; 
                {시도 
                    에 Thread.sleep (30); 
                } 캐치 (예외 : InterruptedException 전자) { 
                    e.printStackTrace (); 
                } 
            } 
            Log.e (TAG "합 ="+ 합); 
            합을 리턴; 
        } 
    } 

    공용 클래스 ThreadFactoryTest는 ThreadFactory를 {구현 

        @Override
              새로운 Thread (r)을 반환; 
        } 
        {공공 스레드 newThread (의 Runnable r)을
            Log.e (TAG, "ThreadFactoryTest newThread"); 
    } 
}

  

 

추천

출처www.cnblogs.com/jtzp007/p/11448515.html