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");
}
} `
の可能性のある重複(https://stackoverflow.com/questions/1562079/ [JavaでエグゼキュータのThreadPoolの実行を停止する方法?] executor-of-exec-of-executor-thread-in-java) – alain
ここでうまく動作します。プログラムは停止します。 –
@JB:私はあなたがabortフラグがtrueの後にまだ実行しているのを見ることができるところにImageを投稿しました。編集で見てください。 –