2017-09-19 11 views
0

enter image description here ExecutorsのshutdownNowメソッドから中断を呼び出した後でもスレッドは停止しません。
スレッドコール機能がwhileループで実行されており、割り込みフラグがチェックされています。 特定の期間が経過すると、実行中のスレッドに割り込みフラグを送信しようとしましたが、それでも実行中です。強制的にスレッドを停止します。 誰でもこの動作を伝えることができます。 は、サンプルのJavaコードをアタッチ:実行中のスレッドから実行中のスレッドを停止するためのエレガントな方法

public class TestExecutor { 


static volatile int j = 1; 

public static void main(String[] args) { 

    ExecutorService pool = Executors.newFixedThreadPool(5); 
    for (int i = 1; i <= 10; ++i) { 

     Future<Map<String, List<String>>> abc = pool.submit(new Callable<Map<String, List<String>>>() { 
     volatile boolean abortFlag = false; 
     @Override 
     public Map<String, List<String>> call() throws Exception { 


      while(!abortFlag){ 
       long start = System.currentTimeMillis(); 
       for(int k=0; k < 10e4 ;k++){ 
        abortFlag = abort(); 
        System.out.println(Thread.currentThread().getName() +" " +abortFlag); 
       } 
       System.out.println("counter val is:" +Thread.currentThread().getName() +" : " +j++); 
       long end = System.currentTimeMillis(); 
       System.out.println("time for one execution : " +" " +Thread.currentThread().getName() +" :" +(end-start)); 
       return null; 
      } 

      return null; 
     } 
     private boolean abort() { 

      if(Thread.currentThread().isInterrupted()){ 
       return true; 
      }else{ 
       return false; 
      } 

     } 
    }); 
    } 
    pool.shutdown(); 

    try { 
     if (pool.awaitTermination(3000, TimeUnit.MILLISECONDS)) { 
      System.out.println("task completed"); 
     } else { 
      System.out.println("Forcing shutdown..."); 
      pool.shutdownNow(); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 


System.out.println("Closed"); 


} 

} `

+0

の可能性のある重複(https://stackoverflow.com/questions/1562079/ [JavaでエグゼキュータのThreadPoolの実行を停止する方法?] executor-of-exec-of-executor-thread-in-java) – alain

+3

ここでうまく動作します。プログラムは停止します。 –

+0

@JB:私はあなたがabortフラグがtrueの後にまだ実行しているのを見ることができるところにImageを投稿しました。編集で見てください。 –

答えて

1

あなたはwhile(!abortFlag)abortFlagに作用する前に、あなたは '長い' 実行を持っています。 終了する機会を得る前に、以下のループに従って、最大10kが印刷されます。アプリケーションはフラグがトグルされたときにだけ、内側のループを終了し、その「長い」タスクを終了する前に終了することができる場合 :)

for(int k=0; k < 10e4 ;k++){ 
    abortFlag = abort(); 
    if (abortFlag) { 
     break; 
    } 
    System.out.println(Thread.currentThread().getName() +" " +abortFlag); 
} 
1

シャットダウンを(、完了するために、すべてのアクティブ/キューに入れられたタスクを待つことになると新しいタスクを提出することはできません。

shutDownNow()は、新しいタスクを許可せず、キューにまだ残っているタスクは実行されず、現在実行中のタスク/スレッドは中断されます。

したがって、shutdownNowの後でもまだ実行されているスレッドが呼び出されるのは、abortFlagに対して何も処理が行われていないため、forループ内にまだ存在するスレッドがまだ実行されているためです。 forループ内にあります。

変更コードスニペット:

abortFlag = abort(); 
if(abortFlag){ 
    System.out.println(Thread.currentThread().getName()+" K="+k); 
    break; 
} 

おかげ ロシャン

関連する問題