Java同時プログラミング-Exectorフレームワーク


1、Exectorフレームワーク:非同期タスク実行フレーム。ライフサイクルのサポートや統計情報収集、アプリケーション管理、性能監視などの仕組みが提供されています。
・生産者ベースの消費者モデル。
・タスクの提出過程をタスク実行プロセスと切り離し、Runnableでタスクを表します。
2、スレッド池
・newFixedThreadPool:固定長のスレッド池を作成します。
・newCachedThreadPool:キャッシュできるスレッド池を作成します。
・newSingleThreadPool:単一スレッドのスレッド池であり、タスクがキューにある順に「FIFO,LIFO,優先度」などをシリアルで実行します。
・newScheduledThreadPool:固定長のスレッド池を作成し、タイミングまたは遅延でタスクを実行します。
3、Exectorライフサイクル
・ExectorServiceのライフサイクルは3つの状態があります。運行、クローズ、終了しました。
・ExectorServiceの作成時は運転状態となります。
・shutdown方法は、新たなタスクを受け付けずに、提出されたタスクの実行が完了するまで待ちます。まだ実行されていないタスクを保護します。
4、Exector類はスレッド池の機能のみを提供しており、ライフサイクル監視の機能を提供していません。
   ExectorService類はスレッド池のみならず、ライフサイクル監視などの機能を備えています。
5、Exector.execute(Runnable command) 
   Futurefuture=ExectorService.submit(Callabletask)
   List<Future<T>list=Exect Service.invokeAll(Collection<Callable<T>taskys、timeout、unit)
6、適用:


import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class TaskExecution {
	private static final ExecutorService exec = Executors.newFixedThreadPool(4);

	public static void main(String[] args) {
 
			Callable<String> task = new Callable<String>() {

				@Override
				public String call() throws Exception {
					Thread.sleep(1000);
					return "success";
				}
				 
			};  
			Future<String> future= exec.submit(task); 
			 
//		try {
//			Thread.sleep(1000);
//		} catch (InterruptedException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		System.out.println("isTerminate = "+exec.isTerminated());
		
		try {
			System.out.println("future.get = "+future.get(800,TimeUnit.NANOSECONDS));
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			exec.shutdown();
		} catch (ExecutionException e) {
			 
			e.printStackTrace();
			exec.shutdown();
		} catch (TimeoutException e) {
			e.printStackTrace();
			future.cancel(true);
			exec.shutdown();
		}
	
		System.out.println("------------");
	}
}