0

スレッドのプールを使用してスレッドを実行する必要があります。spring フレームワークの TaskExecutor クラスを使用します。スレッドを同期する必要があるため、FutureTask クラスを使用します。最後に、コードは次のようになります。

private TaskExecutor taskExecutor;

FutureTask futureTask=new FutureTask(new MyTask());
taskExecutor.execute(futureTask);
try {
  futureTask.get();
} catch (InterruptedException e) {
  e.printStackTrace();
} catch (ExecutionException e) {
  e.printStackTrace();
}

実際、MyTask を実行するスレッドが中断される場合があります。デバッグ モードでは、MyTask のコードで割り込みフラグが設定されていることがわかります。残念ながら、中断された例外はキャッチされず、その理由がわかりません。何か案が?

4

2 に答える 2

0

MyTask のコードに割り込みフラグが設定されていることがわかります。残念ながら、中断された例外はキャッチされず、その理由がわかりません。何か案が?

InterruptedExceptionがスローされるのは、メソッドが何らかのスリープまたは待機 ( 、 など) を行っているときThread.sleep(...)だけObject.wait(...)です。この場合、タスク自体ではなく、呼び出しInterruptedExceptionているスレッドが中断された場合にのみスローされます。呼び出したスレッドはタスクが終了するのを待っているため、中断される可能性があります。 futureTask.get()get()

タスクが中断されたかどうかを確認したい場合はThread.currentThread().isInterrupted()、タスク コード内で使用する必要があります。 通常は、 を呼び出してタスクを中断しますfutureTask.cancel(true)。これにより、タスクがまだ実行されていない場合、タスクの実行が停止されます。現在実行中の場合は、コード内の割り込みビットをテストする必要があります。何かのようなもの:

// your task should do something like this if you have a while loop
while (!Thread.currentThread().isInterrupted()) {
    ...
}
于 2013-09-23T15:57:30.330 に答える
0

InterruptedException を含むタスク実行中に発生する例外はすべて、ExecutionException になります (それらはそれにラップされます)。InterruptedException は、futureTask.get() を実行しているスレッドが中断された場合にのみスローできます。

于 2013-09-23T16:16:07.337 に答える