呼び出し可能な将来のインターフェイス
Callableは、runnableに似たインターフェイスです。コール可能なインターフェイスを実装し、実行可能なクラスは他のスレッドで実行できるタスクです。
CallableとRunnableにはいくつかの違いがあります。
(1)callableで指定されたメソッドはcall()であり、runnableで指定されたメソッドは実行()です。
(2)呼び出し可能なタスクは、実行後に値を返すことができますが、実行可能なタスクは値を返すことができません。
(3)call()メソッドは例外をスローできますが、run()メソッドは例外をスローできません。
(4)呼び出し可能なタスクを実行すると、将来のオブジェクトを取得できます。
計算が完了したかどうかを確認し、計算が完了するのを待つ方法、計算の結果を取得する方法を提供します。
将来のオブジェクトを通じて、タスクの実行ステータスを理解し、タスクの実行をキャンセルし、タスク実行の結果を取得できます。
コードコピーは次のとおりです。
パッケージcom.yao;
java.util.concurrent.callableをインポートします。
java.util.concurrent.executorserviceをインポートします。
java.util.concurrent.executorsをインポートします。
java.util.concurrent.futureをインポートします。
パブリッククラスのcallableandfuture {
/**
*タスククラスをカスタマイズして、呼び出し可能なインターフェイスを実装します
*/
public static class mycallableclass実装可能{
//ロゴの位置
Private int flag = 0;
public mycallableclass(int flag){
this.flag = flag;
}
public string call()スロー例外{
if(this.flag == 0){
//フラグの値が0の場合は、すぐに返します
"flag = 0"を返します。
}
if(this.flag == 1){
//フラグの値が1の場合、無限のループを実行します
試す {
while(true){
system.out.println( "looping ...");
Thread.Sleep(2000);
}
} catch(arternedexception e){
system.out.println( "割り込み");
}
「false」を返します。
} それ以外 {
// falseが0または1でない場合、例外がスローされます
新しい例外をスローします( "Bad Flag Value!");
}
}
}
public static void main(string [] args){
// 3つの呼び出し可能なタイプのタスクを定義します
mycallableclass task1 = new mycallableclass(0);
mycallableclass task2 = new mycallableclass(1);
mycallableclass task3 = new mycallableclass(2);
//タスクを実行するサービスを作成します
executorservice es = executors.newfixedthreadpool(3);
試す {
//タスクを開始すると、将来のオブジェクトが返されます。
//タスクの実行または例外の結果を取得したい場合は、この将来のオブジェクトで動作することができます
Future Future1 = es.submit(task1);
//最初のタスクの結果を取得します。
System.out.println( "task1:" + future1.get());
Future Future2 = es.submit(task2);
// 2番目のタスクを停止する前に5秒間待ちます。 2番目のタスクは無限ループだからです
thread.sleep(5000);
system.out.println( "task2キャンセル:" + future2.cancel(true));
// 3番目のタスクを実行すると例外が原因であるため、3番目のタスクの出力を取得します
//したがって、次のステートメントにより、例外がスローされます
Future Future3 = es.submit(task3);
System.out.println( "task3:" + future3.get());
} catch(例外e){
system.out.println(e.toString());
}
//タスク実行サービスを停止します
es.shutdownnow();
}
}