什么是从执行程序服务停止正在运行的线程的优雅方法

时间:2017-09-19 11:34:59

标签: java multithreading concurrency executorservice

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");


}

} `

2 个答案:

答案 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;
 }

由于 罗斯汉