で ジャワ 、 未来 です インターフェース それはに属します java.util.concurrent パッケージ 。非同期計算の結果を表すために使用されます。このインターフェイスは、計算が完了したかどうかを確認し、完了を待ち、計算の結果を取得するためのメソッドを提供します。タスクまたは計算が完了すると、計算をキャンセルすることはできません。
構文:
public interface Future
Java の将来の例
Java Future の最良の例は次のとおりです。 ExecutorService インターフェース。 1 つ以上の非同期タスクの進行状況を追跡するための Future (メソッドの一部から) オブジェクトを生成します。
将来のインターフェイスのメソッド
このインターフェイスでは、次の 5 つのメソッドが提供されます。
方法 | 説明 |
---|---|
キャンセル() | タスクの実行をキャンセルしようとします。 |
得る() | このメソッドは、必要に応じて計算が完了するまで待機し、その結果を取得します。 |
得る() | 必要に応じて、計算が完了するまで最大でも指定された時間待機し、結果が利用可能な場合はその結果を取得します。 |
isCancelled() | タスクが完了前にキャンセルされた場合は true を返します。 |
終わらせる() | タスクが完了すると true を返します。 |
Future インターフェースには次のような欠点がありました。
- Future を使用すると、計算を手動で完了することはできません。
- 転流が完了しても通知しません。
- そのチェーンを作成したり組み合わせたりすることはできません。
上記の制限を克服するために、 Java 8 紹介された 完成可能な未来 。
非同期プログラミングでの Future の使用
結果の取得
上で説明したように、Future は非同期タスクの結果を表します。非同期タスクの結果を取得するために、Java Future インターフェイスには次の 2 つのバージョンの get() メソッドが用意されており、どちらもオブジェクトを返します。戻り値の型がジェネリック型である可能性があることに注意してください。例えば:
Future future = ... // get Future by starting async task // do something else, until ready to check result via Future // get result from Future try { Object result = future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }
注: 非同期タスクが完了する前に get() メソッドを呼び出そうとすると、結果が準備できるまで get() メソッドはブロックされます。
上記の欠点を克服するために、Future インターフェイスは、ある量を除いた別のバージョンの get() メソッドを提供します。 時間 (ミリ秒単位) をパラメータとして指定します。これは、Future で結果が利用可能になった後、Future がタスクを完了するまで一定の時間待機することを表します。例えば:
try { Object result = future.get(1000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { } catch (ExecutionException e) { } catch (TimeoutException e) { // thrown if timeout time interval passes // before a result is available. }
Future が指定された時間内に結果を取得できない場合、 タイムアウト例外 未来によって投げられます。
非同期タスクのキャンセル
また、を呼び出すことで、いつでも非同期タスクをキャンセルできます。 キャンセル() Future インターフェイスのメソッド。例えば:
Future future = ... // Get Future from somewhere future.cancel();
非同期タスクが完了したかどうかを確認する
インターフェイスはメソッドを提供します 終わらせる() 非同期タスクが完了したかどうかを確認します。例えば:
Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else }
非同期タスクがキャンセルされたかどうかを確認する
Future インターフェースはメソッドを提供します isCancelled() Future で表される非同期タスクがキャンセルされたかどうかを確認します。タスクが正常にキャンセルされた場合は true を返し、それ以外の場合は false を返します。例えば:
Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
Java の将来の例
FutureExample.java
import java.util.concurrent.*; public class FutureExample { public static void main(String args[]) throws InterruptedException, ExecutionException { //ExecutorService allows us to execute tasks on threads asynchronously ExecutorService es = Executors.newSingleThreadExecutor(); //getting future //the method submit() submits a value-returning task for execution and returns the Future Future future = es.submit(() -> { //sleep thread for 2 seconds Thread.sleep(2000); return 'Welcome to Javatpoint'; }); //checks if the task is completed or not while(!future.isDone()) { System.out.println('The task is still in process.....'); //sleep thread for 2 milliseconds Thread.sleep(200); } System.out.println('Task completed! getting the result'); //getting the result after completing the task String result = future.get(); //prints the result System.out.println(result); es.shutdown(); } }
出力: