2016-06-17 2 views
1

メインスレッドでExecutorService.shutdownNow()を実行しても、すべてのスレッドが停止するわけではありませんが、Thread1またはThread2でExecutorService.shutdownNow()を実行するとサブスレッドが終了します シャットダウンコマンドを最下位レベルにカスケードする方法はありますか?ツリー内のすべてのスレッドを停止するには?

 Main thread 
     / \ 
    /  \ 
Thread 1 Thread 2 
| | |  | |  
A B C  D E 

メインスレッドからすべてのスレッドを削除するにはどうすればよいですか?スレッドの子スレッドの中断を処理する方法

CompletionService<Object> completionService = new ExecutorCompletionService<Object>(threadExecutor); 
         List<Future<Object>> futures = new ArrayList<Future<Object>>(); 
         for(MultiThread mt : threadList) 
         { 
         futures.add(completionService.submit(mt)); 
         } 

         while (futures.size() > 0) { 
          Future f = completionService.take(); 
          futures.remove(f); 
          try { 
           Object result = f.get(); 
           System.out.println(result); 
          } catch (Exception e) { 
           System.out.println("Caught exception from one task: " + e.getCause().getMessage() + ". shutdown now!"); 
           threadExecutor.shutdownNow(); 
           break; 
          } 
         } 

をcraeteするスニペットの下に使用して

? Javadocに基づいて

+0

実行者の数はいくつですか?それらのすべてに対してインスタンスメソッド 'shutdownNow()'を呼び出しましたか? –

+0

私は2つのエグゼキュータを持っています...メインスレッドでは1つ、スレッド1とスレッド2を作成する子スレッドではもう1つです。両方のエグゼキュータでshutdownNow()を呼び出しましたが、thread1とthread2エグゼキュータのshutdownNow()のみが動作しています。 – happy

+0

マルチスレッドでの私の経験から、各スレッドをループしてヌルに設定したり、終了させたりする必要があります。私は通常、Runnableを実装してスレッドを作成したいと思っています。 – Dominic

答えて

1

shutdownNowの リストshutdownNowの() : 試みは、実行中のアクティブなタスクすべてを停止するには、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。 このメソッドは、タスクをアクティブに実行して終了するのを待機しません。これを行うにはawaitTerminationを使用します。

実行中のタスクの処理を最善の努力で止めようとしても保証はありません。 たとえば、典型的な実装ではThread.interrupt()を介してキャンセルされるため、割り込みに応答しないタスクは決して終了しない可能性があります。

+0

実行中のタスクがYieldを持たず、Interruptイベントに応答しない可能性があります。 –

0

ThreadPoolExecutorを使用して、ThreadFactoryのインスタンスを渡すことができます。 ThreadFactoryは、作成された新しいスレッドにそれぞれ関連付けられた固有のThreadGroupを使用します。すべてのスレッドを中断する必要がある場合は、ThreadGroup割り込みメソッドを使用すれば、すべてのスレッドが中断されます。

public class GroupThreadFactory implements ThreadFactory { 
    private ThreadGroup group; 

    public GroupThreadFactory(ThreadGroup group) { 
     this.group = group; 
    } 

    public Thread newThread(Runnable r) { 
     return new Thread(group, r); 
    } 
} 
関連する問題