我是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()吗?
答案 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中启动了另一个线程。
此执行程序不知道您打算向其提交多少任务,因此它将保持其线程运行,直到您明确告知它关闭为止。