enter image description here即使在从Executors shutdownNow方法调用Interruption后,线程也不会停止 线程调用功能在while循环中运行,该循环检查Interruption标志。 我尝试在一段时间后向正在运行的线程发送中断标志,但它仍在执行。我想强制停止线程。 任何人都可以说出这种行为。 附加示例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 :(得分:1)
在对abortFlag
while(!abortFlag)
采取行动之前,您需要执行“长时间”。
根据下面的循环,在您有机会退出之前,您将获得 10k 打印输出。
如果您的应用程序可以在完成“long”任务之前退出,那么只需在切换标志时退出内部循环:
for(int k=0; k < 10e4 ;k++){
abortFlag = abort();
if (abortFlag) {
break;
}
System.out.println(Thread.currentThread().getName() +" " +abortFlag);
}
答案 1 :(得分:1)
shutDown(),将等待所有活动/排队任务完成,并且不允许提交任何新任务。
shutDownNow(),将不允许任何新任务和队列中仍然存在的任务将被运行,并且当前正在运行的任务/线程将被中断。
所以, 调用shutdownNow之后仍然运行的线程的原因是因为仍然在for循环中的线程仍然在运行,因为对abortFlag没有采取任何操作。在for循环中。
更改代码段:
abortFlag = abort();
if(abortFlag){
System.out.println(Thread.currentThread().getName()+" K="+k);
break;
}
由于 罗斯汉