CallableおよびFutureを使用した並列プログラミング
Javaで並列プログラミングを実行する最も一般的な方法は、スレッドクラスを継承するか、実行可能なインターフェイスを実装することです。これらの2つの方法の欠点は、タスクが完了した直後に実行結果を取得できないことであり、使用するのが不便な共有変数またはスレッド間で伝達する必要があります。
Java 1.5から始めて、呼び出し可能なインターフェイスと将来のインターフェイスが提供されます。それらを使用することにより、タスクが実行された後に実行結果を取得できます。
Callable、Future、およびFutureTaskの使用方法を学びましょう。
呼び出し可能なインターフェイス
呼び出し可能なインターフェイスは、java.util.concurrentパッケージにあります。これは、call()メソッドのみを宣言する一般的なインターフェイスです。
パブリックインターフェイスコール可能<t> {t call()スロー例外;}一般に、ExecutorServiceインターフェイスと組み合わせて使用されます。いくつかの過負荷の送信方法は、executorserviceインターフェイスで宣言されています。
<t> future <t> submit(callable <t> task); <t> future <t> submit(runnable task、t result); future <?> submit(runnable task);
最初の送信方法のパラメータータイプは呼び出され、他の2つは当面の間この記事ではカバーされていません。
FutureとFutureTask
将来のインターフェイスの実装クラスは、実行可能または呼び出し可能なタスクでのキャンセル、クエリ、および結果の取得などの操作を実行できます。
将来のインターフェイスは、java.util.concurrentパッケージの下にもあります。
public Interface Future <t> { /***task*@param mayinterrumpifrunning*実行中ですが完了していないタスクのキャンセルが可能ですか? trueが設定されている場合、プロセス内のタスクをキャンセルできることを意味します *タスクが実行されている場合、タスクがまだ実行されていない場合、trueがtrueを返します。 /***タスクは正常にキャンセルされますか?タスクが正常に完了する前に正常にキャンセルされた場合、true */ boolean iscancelled()を返します。 / ***タスクは完了しますか*/ boolean isdone(); / ***ブロックを介して実行結果を取得します*/ t get()throws interrutedexception、executionexception; /***ブロックを通じて実行結果を取得します。指定された時間内に返品が返されない場合、null */ t get(long timeout、timeunit unit)を返します。要約すると、Futureは3つの機能を提供します。
タスクが完了しているかどうかを判断し、タスクを中断し、タスクの実行の結果を取得できる
JDKは、次の2つのコンストラクターを備えた将来のインターフェイス実装クラスFutureTaskを提供します。
Public FutureTask(Callable <t> callable){} public futureTask(Runnable Runnable、t result){}サンプルコード
Callableを使用して、未来
import java.util.concurrent。*; public class test {public static void main(string [] args){executorservice executorservice = executors.newcachedthreadpool();タスクタスク= new Task(); future <integer> future = executorservice.submit(task); executorservice.shutdown(); System.out.println( "メインスレッドはタスクを実行しています..."); {thread.sleep(2000); } catch(arturnedexception ex){ex.printstacktrace(); } try {system.out.println( "task run result:"+future.get()); } catch(arturnedexception ex){ex.printstacktrace(); } catch(executionException ex){ex.printstacktrace(); } system.out.println( "すべてのタスクが実行されました"); }} classタスクを実装するcallable <integer> {@override public integer call()throws exception {system.out.println( "子スレッドはタスクを実行している..."); //シミュレーションタスクはthime thread.sleep(5000); 1000を返します。 }}実行結果:
子スレッドがタスクを実行しています...メインスレッドはタスクを実行しています...タスク操作結果:1000すべてのタスクが実行されました
Callable、FutureTaskを使用してください
import java.util.concurrent。*; public class test {public static void main(string [] args){executorservice executorservice = executors.newcachedthreadpool();タスクタスク= new Task(); FutureTask <Integer> futureTask = new FutureTask <Integer>(task); executorservice.submit(futuretask); executorservice.shutdown(); System.out.println( "メインスレッドはタスクを実行しています..."); {thread.sleep(2000); } catch(arturnedexception ex){ex.printstacktrace(); } try {system.out.println( "task run result:"+futuretask.get()); } catch(arturnedexception ex){ex.printstacktrace(); } catch(executionException ex){ex.printstacktrace(); } system.out.println( "すべてのタスクが実行されます"); }} classタスクを実装するcallable <integer> {@override public integer call()throws exception {system.out.println( "子スレッドがタスクを実行している..."); //タスクをシミュレートすると、swree.sleep(5000); 1000を返します。 }}実行結果:
子スレッドがタスクを実行しています...メインスレッドはタスクを実行しています...タスク操作結果:1000すべてのタスクが実行されました
要約します
上記は、Javaでの並列プログラミングにCallableとFutureを使用することに関するこの記事のすべての内容です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!