スレッドプールは、複数のタスクを同時に実行できます。場合によっては、タスクの実行結果を追跡したい場合があります。一定期間内であっても、タスクが完了していない場合は、タスクの実行をキャンセルすることもできます。この機能をサポートするために、ThreadPoolexecutorは、タスクの実行とキャンセルを追跡するためのFutureTaskを提供します。この記事では、FutureTaskの実装原則を紹介します。
FutureTaskの実装原則をよりよく理解するために、最初にいくつかの重要なインターフェイスとクラス構造を提供します。
ThreadPoolexecutorは、タスクを送信するための送信インターフェイスを提供します。送信サポートは、実行可能で呼び出し可能な2つの異なるインターフェイスです。統一された外部インターフェイスを提供するために、JDKは内部的にラップラップを呼び出し可能にします。これらはすべてRunNableAdapterアダプターを介して実装されています。以下は、runnableadapterのソースコードです。
静的な最終クラスrunnableadapter <t>は、呼び出し可能な<t> {final runnableタスクを実装します。最終的な結果。 runnableadapter(runnable task、t result){this.task = task; this.result = result; } public t call(){task.run();返品結果; }}RunNableAdapterは、コールメソッドを実装するコール可能な実装クラスです。コールメソッドは、単にtask.run()を呼び出してから結果を返します。これにより、呼び出し可能なインターフェイスのみが均一に内部で処理する必要があります。
前のセクションを通じて、提出された実行可能なタスクがコール可能なタスクに内部的に変換されていることがわかります。将来である送信方法の返品値を確認してください。実際、この未来はFutureTaskのインスタンスです。このインスタンスを通じて、GETメソッドを呼び出すと、タスクが完了して結果が返されるまで現在のスレッドをブロックできます。
コールチェーン全体が次のようになります:
ワーカースレッド - > futuretask.run() - > callable.call() - > task.run()
呼び出し可能なタスクが送信された場合、最初の3つの呼び出しのみがあります。
プロセス全体をより適切に実証するために、次の例を使用して実行プロセスを実証します。
1.コール可能なタスクをスレッドプールに送信します(実行可能にもcallableに変換されます)。この時点で、以下に示すように、呼び出し可能なものはFutureTaskインスタンスに渡されます。
2.スレッドプールは、スレッドを使用してFutureTaskタスクを実行します。
タスクを実行するプロセスは比較的簡単です。最終的に、callable.call()またはrunnable.run()メソッドが呼び出され、結果が取得され、結果がfuturetaskインスタンスの結果プロパティに保存され、ステータスが正常に変更され、タスクが実行され、結果が得られることを示します。
callable.call()の実行中に、複数のスレッドが同じFutureTaskインスタンスのGETメソッドを呼び出すと想定しています。この時点で、これらのスレッドは、下の図に示すように、ブロックされてスタックに保存されます。
スレッド1、2、および3はFutureTask.getメソッドを呼び出します。タスクは実行されていないため、3つのスレッドはすべてブロックされ、眠くなります。 futureTaskには、待機スレッドを保存するスタックがあります。スタックのトップポインターは、 FutureTask.waitersが参照しています。タスクが実行されると、スタック全体のスレッドが繰り返されます。この時点で、各スレッドが目覚め、タスクの実行結果を正常に取得できます(実行結果はFutureTask.outcome) 。
FutureTaskは、タスクのキャンセル関数もサポートしており、すべてがFutureTaskの状態を通じて複数のスレッドを調整します。
FutureTaskインターフェイスは、タスクの実行の追跡と制御を提供する実装メカニズムです。スレッドプール自体と比較して、それは比較的単純であり、理解することは難しくないと思います。
上記は、JavaスレッドプールのFutureTaskの実装原則に関するこの記事のすべての内容です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!