『Java同時実行』:第4節スレッドプール

2345 ワード

1、Javaのスレッドプール
JAva APIには、3つのスレッドプールExecutors.newCachedThreadPool()、Executors.newFixedThreadPool(.)、Executors.newSingleThreadExecutor()、一般的には、ここで定義したスレッドプールを使用してタスクを完了できます.
2、カスタムスレッドプール
Executors.newCachedThreadPool()のソースコードを表示すると、自分のnew ThreadPoolExecutorで異なるパラメータを入力することで自分のスレッドプールをカスタマイズできることがわかります.
コード1:
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue());
    }
上のコードには、上記の例のパラメータに加えて、ThreadFactory threadFactoryパラメータを追加的に受け入れるリロード方法もあります.
コード2:
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue(),
                                      threadFactory);
    }
コードから、スレッドプールのプロパティを独自のnew ThreadPoolExecutorでカスタマイズできることがわかりました.
コード2から、独自のThreadFactoryを実現することで、スレッドを生成する方法をカスタマイズできることを知っています.
次に、バックグラウンドスレッドを常に生成するスレッドプールを実現します.
class MyExecutors
{
	/**
	 *         ,             
	 */
	public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      120L, TimeUnit.SECONDS,
                                      new SynchronousQueue(),
                                      threadFactory);
    }
}

/**
 *        ,       
 */
class MyThreadFactory implements ThreadFactory
{

	@Override
	public Thread newThread(Runnable r) {
		Thread t = new Thread(r);
		t.setDaemon(true);
		t.setPriority(Thread.MAX_PRIORITY);
		return t;
	}
	
}

class TaskTest implements Runnable
{
	@Override
	public void run() {
		System.out.println(Thread.currentThread().isDaemon());
	}
	
}
public class ThreadPoolTest 
{
    public static void main(String[] args)
    {
    	ExecutorService exec = MyExecutors.newCachedThreadPool(new MyThreadFactory());
    	exec.execute(new TaskTest());
    	
    	exec.shutdown();
    }
}
上記のプログラムはコンソールにtrueを出力し、スレッドプールで生産されたスレッドのプロパティをカスタマイズすることに成功したことを示します.