10

ThreadPool10 個の固定スレッドを含む を作成します。スレッドプールで実行時間の長いスレッドを中断する必要がある場合があります。これは主に、スレッドが一部の操作でブロックされており、タイムアウトが発生してスレッドを中断するためです。をキャッチしInterruptedException、スレッドのステータスも割り込みに設定します。その場合、私の質問は、ThreadPool新しい Thread を作成し、中断されたスレッドを新しい One に置き換えますか? 以下は、スレッドによって実行されるサンプル コードです。質問は、このスレッドが中断された場合、スレッド プールはこのスレッドを新しいスレッドに置き換えますか?

 public ResponseMessage call(){
    Future<ResponseMessage> future = CacheManager.getInstance().asyncFetch();
    ResponseMessage response = null;
    try {
        response = future.get();
    }
    catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } catch (ExecutionException ex) {
        //create a blank response
    }

    return response;
}
4

2 に答える 2

7

自分が「所有」していないスレッドを中断するべきではありません。スレッドがどのように応答するかわからないからです。スレッドのスケジューリングを制御できないため、中断した瞬間に特定のスレッドが特定のタスクを実行しているかどうかはわかりません。

エグゼキュータ サービスに与えたタスクをキャンセルする場合はcancel(true)、関連するを呼び出しますFuture。タスクが割り込み要求を検出すると、 を呼び出して割り込みステータスを保持する必要がありますThread.currentThread().interrupt()

これを行うと、エグゼキューターはスレッド自体に割り込んだため、割り込みをきれいに処理し、割り込みが発生したときにスレッドがタスクを実行していたことを認識します。

于 2012-04-06T01:06:07.187 に答える