Concurrentパッケージ-Executors、Executor、ExecutorService、ThreadPoolExecutor簡単な分析

3394 ワード

前の順序:
この記事は、Executor、ExecutorService、ThreadPoolExecutorのいくつかのクラスの関係を概略的に理解することを目的としています.
 
まず簡単な例A 1を見てみましょう.
 
public class CacheThreadPool {  
    public static void main(String[] args) {  
        ExecutorService exec=Executors.newCachedThreadPool();  
        for(int i=0;i<5;i++)  
            exec.execute(new LiftOff());  
        exec.shutdown();//shutdown  ,  shutdownNow  ( ) 。  
    }  
}  

 
ExecutorServiceとExcutorは、次のようなインタフェースです.
 
ExecutorService:
public interface ExecutorService extends Executor {  
    void shutdown();  
    List<Runnable> shutdownNow();  
    boolean isShutdown();  
    boolean isTerminated();  
    boolean awaitTermination(long timeout, TimeUnit unit)  
    <T> Future<T> submit(Callable<T> task);  
    <T> Future<T> submit(Runnable task, T result);  
    Future<?> submit(Runnable task);  
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)  
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)  
    <T> T invokeAny(Collection<? extends Callable<T>> tasks)  
    <T> T invokeAny(Collection<? extends Callable<T>> tasks,  
                    long timeout, TimeUnit unit)  
}  

 
Executor:
public interface Executor {
    void execute(Runnable command);
}

 
Executors:クラスで、次のスレッドプールを生成できます.
1、newSingleThreadExecutor:シリアルでタスクを実行するための単一スレッドプール.
2、newFixedThreadPool:固定サイズのスレッドプールを作成し、タスクをコミットするたびにスレッドを作成します.スレッドがスレッドプールの最大サイズに達するまで、スレッドプールが最大値に達するとブロックされます.
3、newCachedThreadPool:キャッシュ付きスレッドプールを作成し、スレッドプールのサイズがタスクの処理に必要なスレッドを超えると、一部の空き(60秒で実行しないタスク)スレッドが回収され、タスクが足りない場合は自動的に新しいスレッドが追加され、上限はオペレーティングシステムに依存して最大スレッドサイズを作成することができる.
 
NewCachedThreadPoolは実際には機能別にThreadPoolExecutorをカプセル化していますが、他のいくつかも似ています.ここでは、自分のプロジェクトのニーズに合わせて適応したスレッドプールをカスタマイズすることができます.後述します.
 
public static ExecutorService newCachedThreadPool() {  
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,  
                                      60L, TimeUnit.SECONDS,  
                                      new SynchronousQueue<Runnable>());  
}  

 
カスタムThreadPoolExecutorの例:
/**
 *  action 
 * @param corePoolSize  , 
 * @param maxPoolSize   
 * @param keepAliveTime  , 
 * @param cacheSize  
 * @param prefix  
 */
public Executor(int corePoolSize, int maxPoolSize, int keepAliveTime, int cacheSize, String prefix) {
	TimeUnit unit = TimeUnit.MINUTES;
	LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
	RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();
	if (prefix == null) {
		prefix = "";
	}
	ThreadFactory threadFactory = new Threads(prefix);
	ThreadPoolExecutor pool = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
}