ForkJoinPool
タスク (RecursiveAction
または) を送信するために使用しているときに、例外 (キャッチされない) を処理するより良い方法は何RecursiveTask
ですか?
ForkJoinPool は、Thread.UncaughtExceptionHandler
WorkerThread が突然終了した場合 (これはとにかく私たちの制御下にはありません)、例外を処理するために を受け入れますが、このハンドラーは がForkJoinTask
例外をスローする場合には使用されません。私は実装で標準submit
/invokeAll
方法を使用しています。
これが私のシナリオです:
サードパーティのシステムからデータを読み取る無限ループでスレッドを実行しています。このスレッドでは、タスクをForkJoinPool
new Thread() { public void run() { while (true) { ForkJoinTask<Void> uselessReturn = ForkJoinPool.submit(RecursiveActionTask); } } }
私は RecursiveAction を使用しており、いくつかのシナリオでは RecursiveTask を使用しています。これらのタスクはメソッドを使用して FJPool に送信されsubmit()
ます。UncaughtExceptionHandler
タスクがチェックされていない/キャッチされていない例外をスローした場合に、例外を処理し、必要に応じてタスクを再送信できるような一般的な例外ハンドラーが必要です。例外を処理することで、タスクの 1 つまたは一部が例外をスローした場合に、キューに入れられたタスクが取り消されないようにすることもできます。
invokeAll()
メソッドは一連の ForkJoinTasks を返しますが、これらのタスクは再帰ブロックにあります (各タスクはcompute()
メソッドを呼び出し、さらに分割される可能性があります [仮想シナリオ] )
class RecursiveActionTask extends RecursiveAction {
public void compute() {
if <task.size() <= ACCEPTABLE_SIZE) {
processTask() // this might throw an checked/unchecked exception
} else {
RecursiveActionTask[] splitTasks = splitTasks(tasks)
RecursiveActionTasks returnedTasks = invokeAll(splitTasks);
// the below code never executes as invokeAll submits the tasks to the pool
// and the flow never comes to the code below.
// I am looking for some handling like this
for (RecusiveActionTask task : returnedTasks) {
if (task.isDone()) {
task.getException() // handle this exception
}
}
}
}
}
3 ~ 4 個のタスクが失敗すると、キュー送信ユニット全体が破棄されることに気付きました。現在、私はtry/catch
個人的に好きではないプロセスタスクを回避しています。より一般的なものを探しています。
- また、失敗したタスクのすべてのリストを知りたいので、それらを再送信できます
- タスクが例外をスローすると、スレッドはプールから追い出されますか?
- FutureTask でメソッドを呼び出す
get()
と、タスクが完了するまで待機するため、フローがシーケンシャルになる可能性が高くなります。 - Task が失敗した場合のみ、Task のステータスを知りたい。いつ完了するかは気にしません (明らかに 1 時間後に待ちたくありません)。
上記のシナリオで例外を処理する方法はありますか?