問題タブ [executor]
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.
recursion - 再帰メソッドで Future と Callable を使用するには?
Future と Callable を使用して、dfs 再帰メソッドを並列に変換して効率を改善しようとしています。しかし、それを正しく行う方法がわかりません。コードは次のとおりです。
私が期待しているのは、再帰メソッドが task.get() の戻り値を待たずに計算を続けることです。したがって、深さ 3 に進むたびに、将来のタスクを送信し、別の子を計算するために戻りますが、タスクは同時に独自のサブツリーを計算します。
ただし、この方法はまだ並列ではなく、順番に行われていることがわかりました。(メソッドが呼び出されるたびに深さを出力しましたが、結果はフューチャーとエグゼキューターを使用しないメソッドと同じで、常に遅くなりました。)
これは Future と Callable を使用する正しい方法ではないと思います。いくつかの例を見つけましたが、再帰的な方法を使用していません。最も一般的な例は、Future List> のリストを持ち、毎回タスクを送信し、その後別のループで Future リストを反復することです。
Future と Executor を再帰的な方法で実装する方法を知っている人はいますか?
java - Java で、追加のタスクを自分自身に送信する可能性がある場合に executorservice をシャットダウンする方法
タスクのパイプラインがあり (パイプライン内の各タスクには異なる並列処理要件があります)、各タスクは異なる ExecutorService で動作します。タスクはデータのパケットで動作するため、10 個のデータ パケットがある場合、10 個のタスクが に送信されservice1
、データ パケットごとに 1 つのタスクが送信されます。にサブミットされたタスクservice1
が実際に呼び出されると、新しいタスクをサブミットしてデータパケットをさらに処理することがservice2
できservice3
ます。
次のコードは正常に動作します。
shutdown()
service1
すべてが送信された後に呼び出されますservice1
その後、shutdown() の前に送信されたすべてのタスクが実際に実行を完了するまで、awaitTermination() は返されません。--その後、 onが
/li>shutdown()
呼び出されますが、送信されたすべてのタスクが完了し、すべてのタスクが送信されているためです。-- などservice2
service1
service2
service1
service2
shutdown()
service2
service3
ただしservice2
、データパケットを小さなパケットに分割して追加のタスクを送信できるケースを追加したservice2
ところ、コードが失敗しています。問題は、すべてのタスクが完了するshutdown()
と呼び出されることですが、実行中のタスクから追加のタスクを送信する必要があります。service2
service1
service2
service2
私の質問:
- 送信されたすべてのタスクの実行が終了した後に再実行しますか
shutdown()
、それともすぐに戻りますが、既に送信されたタスクの実行を停止しませんか? 更新:以下に回答 - 新しい問題を解決するにはどうすればよいですか?
java - エグゼキュータ スレッドを中断する方法
エグゼキュータのスレッドを中断する正しい方法は? 私はこれを持っています:メソッドを持つWorkerという名前のスレッドクラス:
そしてメインクラス:
worker.interrupt();
orを呼び出そうとしましexecutorService.shutdownNow();
たが、スレッドが続行し、isInterrupted() が false です。
java - 別のタスクと並行してタスクを実行する
Foo
クラスを使用する次のクラスがありますFooProcessor
。だから私がやりたいのは、cp1インスタンスプロセスメソッドを実行しながら、並行して実行したいcp2.process()
.
ただし、cp1 を順次実行したいので、実行して完了させたいのですが、cp2 が完了しないか失敗しても問題ありません。失敗しない場合は、結果に参加したいと思います。このサンプルでは何も返されていませんが、結果を返したいです。
この目的のために、TaskExecutor を使用する必要がありますか? またはスレッド?
cp1 と並行して cp2 だけを実行したい。または、さらに追加する場合は、cp3 と言って、それを cp1 と並行して実行したいと考えています。
java - バックグラウンドタスクを実行する前に、swingworkerをキャンセルして完了するのを待つことはできますか?
バックグラウンドタスクを実行する前に、をキャンセルしSwingworker
て完了するのを待つことはできますか?doInBackground()
または、 Swing Worker全体をキャンセルせずに、コードを実行するタスクに割り込みを送信することもできます。
私の問題は、コードインが完了done()
する前にコードインを開始したくないということです。doInBackground()
以前のコードではキャンセルが呼び出されることはありませんでした。Swingworker
代わりに、がチェックし、クローズダウンが適切に設定されているかどうかを確認する揮発性ブール値を設定しましたWidgetController
。WidgetController
このフラグをチェックするのに時間がかかることがあることを除いて、これはすべて正常に機能したので、割り込みメソッドを使用できるようにする必要があります。
疑似例
ユーザーが[開始]をクリックするとダイアログが表示されます。WidgetDialogListener
これにより、のインスタンスが作成されWidgetWorker
、これが開始WidgetController
され、が表示されます。通常の表示がWidgetProgressDialog
完了すると、実行内容の概要が表示されます。WidgetController
ShowWidgetReport
WidgetController
WidgetController
が実行されている間、WidgetProgressDialog
進行状況を示すが表示されます。ユーザーがキャンセルボタンをクリックして進行を停止すると、実際に完了するのを待たずWidgetController
に割り込みが送信さ れ、doneメソッドが呼び出されて表示されます。しかし、実際に完了するまで、これを実行したくありません。widgetcontroller
ShowWidgetReport
WidgetController
編集
ジェイコブが私に指摘したことを実際に終えるために、キャンセルされた未来を待つでAwaitingWorker
説明されたものを使用しました
おそらく解決策を正確に誤解しているかもしれませんが、どちらの方法でも、GUIスレッドは非GUIタスクが終了するのを待つことになりますが、私が欲しいのは、非GUIタスクが完了する前に完了することです。 GUIスレッド。
java - Java で executorService を使用せずにエグゼキュータをシャットダウンする
Executor
最初ににキャストせずに Java でをシャットダウンする方法はありExecutorService
ますか? 基本的に私はそれと呼ばれるクラスを持ってExx
いimplements Executor
ます。Exxをシャットダウンしたい。どうすればいいですか?本質的に、私はをシャットダウンする方法を知る必要がありExecutor
ます.
編集: 例:
java - 初期化が必要なワーカーのプールに作業を送信する
s と Thread プールが行うことに近いと思われる問題がありExecutor
ますが、それを正確に適合させることはできません。基本的に、初期化に少し時間がかかり、プールしたいワーカーがあり、準備ができたら、それらを使用して作業を行います。Thread でこれを行う必要があります:
エグゼキューターは私にこれを行うことしか許可しませんが:
独自のスレッド プールを作成する必要がありますか? すでにうまくいっているものを書き直すのは恥ずべきことです。またはThreadLocal
、ワーカーを保持し、Runnable
の run() メソッド内からそれらを管理するために使用する必要がありますか?
android - OutputStreamWriterが書き込まれていません
asynctaskを使用してファイルを作成しました。その後、エグゼキュータが1秒に1回そのファイルに情報を書き込むようにスケジュールしました。ボタンに触れると、エグゼキュータがシャットダウンされ、ファイルが閉じられますが、多くの場合、ファイルには何も書き込まれません。
コード:
停止ボタンが押されるたびに、以前に照会されたSharedPreferenceがtrueに設定されます。
java - Java Executors とスレッドごと (ワークユニットごとではない) オブジェクト?
スレッド プールの設計パターンの恩恵を受けるタスクがあります (多数の小さなタスクを並行して実行する必要があります)。私は最初に単純なスレッド プールをゼロから実装しました。n 個の Runnables はすべてConcurrentLinkedQueue
、キューが空になるまでワーク ユニットをプルし、終了します。次に、「ねえ、Java で Executor を試してみましょう。私の素朴に設計されたシステムよりも、おそらくより適切にテストされ、信頼性が高いからです」と決めました。問題: 私の実装では、各スレッドは while を使用してキューが空になるまで存続し(!queue.isEmpty())
、非スレッドセーフ オブジェクトの独自のインスタンスを取得しましたSlowObject foo
。Runnable
のプールに入るすべての を渡そうとするExecutor
と、時間効率の悪いオブジェクトのインスタンスがスレッドセーフではないため失敗します。SlowObject
for eachRunnable
は構築にコストがかかるため望ましくありません。
SlowObject
「使用しているスレッドの数は?スレッドごとに 1 つ作成し、実行中のスレッドを Runnables に検出させて、使用する正しいオブジェクトを検索させましょう?」と言う方法はありますか? これは脆弱で失敗しやすいように思えますが、代わりにどのデザイン パターンを調べればよいかわかりません。
java - 偽のウェイクアップは Future.get() に影響しますか?
Future.get( timeout, unit ) は、Javadoc の Object.wait() および Condition.await() について文書化されているのと同じタイプの誤ったウェイクアップの影響を受けやすいですか?
スレッドがタイムアウト前に終了しないと仮定すると、1000 ミリ秒待たない可能性はありますか? 完全なタイムアウトを待機する (そしてタイムアウト例外を生成する) 必要があるようですが、そうでなければ結果はどうなりますか?