JAva深化——マルチスレッドを実現する第3の方式(Callableインタフェースを実現し、callメソッドを書き換える)


スレッドを作成する方法の2つについて説明しました.    1)Threadクラスの継承    2)Runnableインタフェースの実現      この2つの方法には、次のような欠点があります.    1)戻り値なし    2)汎用型はサポートされていない    3)異常は処理しなければならない
マルチスレッドを実現する第3の方法:  Callableインタフェースを実現し、callメソッドを書き換える       Callable機能の強化    1)Futureインタフェースはjava.util.concurrentパッケージにあり、具体的なRunnable、Callableタスクの実行結果を取り消すことができる.
         (cancelメソッド、このタスクの実行をキャンセルしようとします)         クエリが完了したかどうか(isDoneメソッド)、結果の取得(getメソッド、完了待ち、結果の取得)など.    2)FutureTaskはFutureインタフェースの唯一の実装クラスである
    3)FutureTaskはRunnable,Futureインタフェースを同時に実現した.Runnableとしてスレッドによって実行することもできます.
           またFutureとしてCallableの戻り値を得ることもできます.
コードの例:
public class Test {
	public static void main(String[] args) throws Exception {
		//    
		MyCallable mc=new MyCallable();
		/**FutureTask     Runnable,Future  。
		 *       Runnable     ,     Future  Callable    
		 */
		//      
		FutureTask task=new FutureTask<>(mc);//    FutureTask   runnable  
		Thread t=new Thread(task);
		t.start();
		System.out.println("    :"+task.get());
		System.out.println("      :"+task.isDone());
	}
}

//  Callable  ,  call  
class MyCallable implements Callable {
	@Override
	public Object call() throws Exception {
		String [] str= {"apple","pear","banana","orange","grape"};
		int i=(int)(Math.random()*5);
		return str[i];
	}
}