問題タブ [futuretask]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - タイムアウトを使用して Java で非同期コードを実行する
私が書いたWebサーバーでは、各リクエストがアクションのリストを呼び出します。これらのアクションのいくつかは、他のアクションほど重要ではないため、バックグラウンド スレッドで実行したいと考えています。
また、それらはそれほど重要ではないため、そのうちの 1 つがめったに失敗しないかどうかは気にしません。また、それらがスレッドを永久に占有することを望まないため、他のスレッドを次のバッチの処理に使用できます。
したがって、スレッド プール (例: 10 スレッド) を用意し、このように各バックグラウンド タスクにスレッドを割り当てたいと思います。各スレッドを 1 秒に制限し、その時間までに終了しない場合は、スレッドを強制終了して、次のタスクが開始されるようにします。
どうすればこれを行うことができますか?
これまでのところ、これは私が持っているものです:
そして、私はこのクラスを次のように使いたい:
これは私が望むように機能しますか?または、どのように変更すればよいですか?
そして、私が呼び出しRun()
たが、スレッドプールに配布する利用可能なスレッドがない場合はどうなりますか?
java - 同時実行に FutureTask を使用する
次のようなサービスがあります。
今はもっと速くしたいのですが、同時に開始できるフィルターもあれば、他のフィルターが終了するのを待たなければならないフィルターもあることがわかりました。例えば:
つまり:
1.filter1 と filter2 は同時に開始でき、filter3 と filter4 も同時に開始できます。
2.filter3 と filter4 は、filter2 が終了するまで待機する必要があります
もう1つ:
filter2 が true を返す場合、'process' メソッドはすぐに戻り、次のフィルターを無視します。
今私のソリューションは FutureTask を使用しています:
私の CallableFilter:
私は知りたいです:
1.この場合、FutureTask を使用することをお勧めしますか? より良い解決策はありますか?
2.スレッドコンテキストスイッチのオーバーヘッド。
ありがとう!
java - ThreadPoolExecutor Android でタスクをキャンセルしようとしているときに cancel() が機能しない
にタスクとして送信されるダウンロードがいくつかありますThreadPoolExecutor
。現在、これThreadPoolExecutor
を拡張するグローバル クラスで作成していますApplication
。送信されたすべてのタスクを ID 付きのハッシュマップに保存しています。
フラグメントにリスト ビューがあります。このリスト ビュー アイテムには、一時停止ボタンと再開ボタンが含まれています。リスト項目自体をクリックすると、ダウンロードFutureTask
がグローバル プール エグゼキュータに送信されます。ここで、リストビュー アイテムの一時停止ボタンをクリックすると、その特定のタスクが一時停止します。
onClick
リスト ビューのカスタム アダプターに一時停止ボタンのメソッドがあります。そのため、ボタンをクリックすると、アダプター クラスで、そのリスト項目に関連する将来のタスクを名前で取得し、.cancel()
. isCancelled()
値を確認すると、 が返されますtrue
。これは、タスクがキャンセルされたことを意味しますが、ダウンロードは引き続き実行され、ファイルは完全にダウンロードされます。どうすればこれを解決できますか? どんな助けでも大歓迎です。
PS: 実行可能プログラムを引数としてエグゼキュータに渡して、スレッドを送信しようとしました。次に、その名前でスレッドを取得し (名前付きのスレッドを返すカスタムを使用) 、再開ボタンが再度押されるまでThreadFactory
呼び出します。thread.wait()
どちらも機能しません!
サンプルコードは次のとおりです。
私のGlobalStateクラス:
私のフラグメントクラス内に書かれている私のダウンロードメソッド。リスト項目のクリックで実行されます:
一時停止ボタンの onclick 内のカスタム リスト アダプター コード:
実際には、タスクを完全にキャンセルするよりも、wait() などを使用してタスクを一時停止および再開することを好みます。どんな助けでも大歓迎です。ありがとうございました!
java - マルチスレッドでタイムアウトになったタスクを終了するにはどうすればよいですか?
同期メソッドと非同期メソッドを含むライブラリを作成する必要があります。
executeSynchronous()
- 結果が出るまで待ち、結果を返します。executeAsynchronous()
- 必要に応じて、他の処理が完了した後に処理できる Future をすぐに返します。
ライブラリのコア ロジック
顧客は私たちのライブラリを使用し、DataKey
ビルダー オブジェクトを渡すことによってそれを呼び出します。次に、そのオブジェクトを使用して URL を作成し、それを実行してその URL への HTTP クライアント呼び出しを行い、JSON 文字列として応答を取得した後、オブジェクトDataKey
を作成してその JSON 文字列をそのまま顧客に返します。 DataResponse
. 一部の顧客から電話がexecuteSynchronous()
あり、一部の顧客から電話がかかる可能性がexecuteAsynchronous()
あるため、ライブラリで 2 つのメソッドを別々に提供する必要があります。
インターフェース:
そして、上記のインターフェースDataClient
を実装するmy があります。Client
実際のタスクを実行する単純なクラス:
問題文:-
このソリューションに取り組み始めたとき、タイムアウトになったタスクを終了していませんでした。タイムアウトをクライアントに報告していましたが、タスクは引き続きスレッド プールで実行されます (制限された 10 個のスレッドの 1 つが長時間占有される可能性があります)。そこで、オンラインでいくつかの調査を行ったところ、以下に示すようcancel
に onを使用してタイムアウトになったタスクをキャンセルできることがわかりました-future
しかし、確認したかったexecuteSynchronous
のですが、タイムアウトになったタスクをキャンセルするためにメソッドで行っている方法が正しいように見えますか?
タスクがまだキューにある場合に実行を停止する を呼び出しcancel()
ているFuture
ので、自分がしていることが正しいかどうかわかりませんか? これを行うための正しいアプローチは何ですか?
より良い方法があれば、誰かがその例を提供できますか?
java - Java Future の変換方法グアバに ListenableFuture
Future から ListenableFuture に変換する方法を見つける必要があります。現在、Future を返すサービスを使用していますが、リスナーを接続する必要があります。サービス インターフェイスは自分のものではないため、変更できません。
それを行う簡単な方法はありますか?
グアバのドキュメントを読みましたが、まだそれを行う方法が見つかりません。