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

时间:2017-07-31 14:44:47

标签: java

我是Java的新手,我知道我的问题可能很愚蠢......我发现如果不调用ExecutorService.shutdown(),我的主方法将被ExecutorService阻止返回:

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()吗?

2 个答案:

答案 0 :(得分:7)

它没有阻塞,只是在Java中只要有非守护程序线程,应用程序没有关闭:

<% 
  if(request.getParameter("dicenum") != null) {
%>  

<% 
int num = Integer.parseInt(request.getParameter("dicenum")); 
if (num == 4)
    num = 1+(int)(Math.random()*4);
else if (num == 6)
    num = 1+(int)(Math.random()*6);
else if (num == 8)
    num = 1+(int)(Math.random()*8);
else if (num == 10)
    num = 1+(int)(Math.random()*10);
else if (num == 20)
    num = 1+(int)(Math.random()*20);
else
    num = 0;
%>
<%= (num == 0)? "The number you've entered is out of range.": num %>
<% } %>

如果要关闭应用程序,则必须关闭executorService。

答案 1 :(得分:4)

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

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