Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ExecutorService会阻止它所在的方法吗?_Java - Fatal编程技术网

Java ExecutorService会阻止它所在的方法吗?

Java ExecutorService会阻止它所在的方法吗?,java,Java,我是一个Java新手,我知道我的问题可能很傻。。。我发现如果我不调用ExecutorService,ExecutorService会阻止我的主方法返回。shutdown: class Test{ public static void main(String[] args){ ExecutorService exec = new Executors.newCachedThreadPool(); exec.execute(new Runnable(){

我是一个Java新手,我知道我的问题可能很傻。。。我发现如果我不调用ExecutorService,ExecutorService会阻止我的主方法返回。shutdown:

class Test{
    public static void main(String[] args){
        ExecutorService exec = new Executors.newCachedThreadPool();
        exec.execute(new Runnable(){
            public void run(){
                System.out.println("I am running!");
            }
        });
    }
}
上面的代码不会在主线程中返回。
我想知道为什么ExecutorService一直阻塞main方法,它的目的是强迫程序员调用shutdown吗?

它不是阻塞,只是在Java中,只要存在非守护进程线程,应用程序就不会关闭:

class Test{
    public static void main(String[] args){
        ExecutorService exec = new Executors.newCachedThreadPool();
        exec.execute(new Runnable(){
            System.out.println("I am running!");
        });
        System.out.println("I am Main!"); //This will run...
    }
}

如果要关闭应用程序,必须关闭Executor服务。

我认为您误解了正在发生的事情。这并不是因为它阻塞了main方法,而是JVM仍然在运行,因为通过创建一个执行器并向其提交一个任务,您已经在JVM中启动了另一个线程


此执行器不知道您要向其提交多少任务,因此它将保持其线程运行,直到您明确告诉它关闭。

什么意思是阻止主方法?需要实现Runnable的run方法。@Roee Gavirel我的意思是主函数将不会运行return@WeizeSun增加一个;在需要的地方,在exec.execute后面有一个print语句,这样我们就可以准确地知道它去了哪里,不去了哪里