shutdown()Java文档不明确

时间:2019-12-12 06:37:24

标签: java multithreading thread-safety

shutdown()的Java文档说:

  

关闭

     

void shutdown()

     

启动有序关闭,在该顺序中将执行先前提交的任务,但不会接受新任务。如果已关闭,则调用不会产生任何其他影响。      此方法不等待先前提交的任务完成执行。使用awaitTermination可以做到这一点。

这两个陈述不矛盾吗? (...先前提交的任务已执行,而Vs不等待先前提交的任务完成执行)?

我使用shutdown()试用了一个示例程序。而且确实会像shutdownNow()一样等待先前提交的任务完成!

为什么下面的代码在应等待析因任务完成时返回I have shutdown true

public class RunnableMain {

    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        RunnableFactorialTask runnableFactorialTask = new RunnableFactorialTask(5);
        executor.submit(runnableFactorialTask);
        executor.shutdown();
        System.out.println(" I have shutdown.."+executor.isShutdown());
    }
}

class RunnableFactorialTask implements Runnable {

    private int num = 0;

    public RunnableFactorialTask(int num) {
        this.num = num;
    }

    @Override
    public void run() {
        int factorial = 1;
        try {
            Thread.currentThread().sleep(6000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for (int i = 2; i <= num; i++) {
            factorial *= i;
        }
        System.out.println("factorial of :" + num + " =" + factorial);
    }
}

1 个答案:

答案 0 :(得分:3)

shutdownNow()shutdown()的呼叫没有阻塞。那就是在文档中提到的。 因此,如果您调用shutdown()shutdownNow(),则不仅在一切正常关闭之后,还可以立即获得控制权。如果要在调用shutdown[Now]()之后等待所有执行程序/线程终止,则必须调用awaitTermination(...),它将阻塞直到所有内容都清除为止。这可能就是您想要的。也可以在这里查看类似问题的答案:Difference between shutdown and shutdownNow of Executor Service