詳細FutureTask

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/ThinkWon/article/details/102542404

FutureTaskについて

エグゼキュータの枠組みの中で、利用可能なFutureTaskは、非同期タスクの結果を示しています。FutureTaskはFutureTaskクエリ非同期タスクが非同期タスクの最終的な結果を得るために、端といくつかの一般的な方法を計算するかどうか、アップを開始し、非同期タスクをキャンセル提供、将来のインタフェースを実現しました。よるget()非同期タスクメソッドの結果を取得しますが、現在の非同期タスクの実行が終了するまでスレッドをブロックします。タスクの実行が終了すると、タスクが再起動できないか、お電話の場合を除き、キャンセルrunAndReset()方法を。これらの状態のために定義されたソースコードのFutureTaskでは:

private static final int NEW          = 0;
private static final int COMPLETING   = 1;
private static final int NORMAL       = 2;
private static final int EXCEPTIONAL  = 3;
private static final int CANCELLED    = 4;
private static final int INTERRUPTING = 5;
private static final int INTERRUPTED  = 6;

また、「Javaの並行プログラミングの芸術」、3つの状態に分けFutureTask.run()メソッド、FutureTaskの実行のタイミングに基づく簿:

  1. 開始されていませんFutureTask.run前()メソッドは、FutureTaskは、非活性状態で、行われていません。FutureTaskを作成する前に、それが非アクティブ状態でFutureTask.run()メソッド、FutureTaskを行っていません。

  2. それが開始されましたプロセスFutureTask.run()メソッドが実行され、FutureTaskは開始状態になっています。

  3. それが完了しましたFutureTask.run()メソッドが実行を終了し、またはタスクをキャンセルするFutureTask.cancel(...)メソッドを呼び出し、あるいは例外がタスクの実行中にスローされた、これらの例は、FutureTaskの完成状態と呼ばれています。

ここに画像を挿入説明

由于FutureTask具有这三种状态,因此执行FutureTask的get方法和cancel方法,当前处于不同的状态对应的结果也是大不相同。这里对get方法和cancel方法做个总结:

get方法

当FutureTask处于未启动或已启动状态时,执行FutureTask.get()方法将导致调用线程阻塞。如果FutureTask处于已完成状态,调用FutureTask.get()方法将导致调用线程立即返回结果或者抛出异常

cancel方法

当FutureTask处于未启动状态时,执行FutureTask.cancel()方法将此任务永远不会执行;

当FutureTask处于已启动状态时,执行FutureTask.cancel(true)方法将以中断线程的方式来阻止任务继续进行,如果执行FutureTask.cancel(false)将不会对正在执行任务的线程有任何影响;

FutureTask处于已完成状态时,执行FutureTask.cancel(…)方法将返回false。

对Future的get()方法和cancel()方法用下图进行总结

ここに画像を挿入説明

FutureTask的基本使用

FutureTask除了实现Future接口外,还实现了Runnable接口。因此,FutureTask可以交给Executor执行,也可以由调用的线程直接执行(FutureTask.run())。另外,FutureTask的获取也可以通过ExecutorService.submit()方法返回一个FutureTask对象,然后在通过FutureTask.get()或者FutureTask.cancel方法。

シナリオ:スレッドは、あなたがFutureTaskを使用することができ、それが継続した後、タスクを実行する別のスレッドを待つ必要があります。複数のスレッドがいくつかのタスクを実行するがあると仮定し、各タスクは、最高1回実行することができます。複数のスレッドが唯一のスレッドがタスクを実行することができ、同じタスクを実行しようとすると、他のスレッドは、このタスクの実行を継続することができます後に待機する必要があります。

参考文献「アートのJava並行プログラミング。」

おすすめ

転載: blog.csdn.net/ThinkWon/article/details/102542404