java.util.concurrent.ExecutorService是否应作为java.sql.Connection关闭?
我怀疑java.util.concurrent.ExecutorService是否应作为java.sql.Connection关闭?,java,executorservice,Java,Executorservice,我怀疑java.util.concurrent.ExecutorService是否应该在所有任务完成或取消后关闭 我有这样一种方法: public void testProxies() { // 5 thread ExecutorService exec = Executors.newFixedThreadPool(5); try { while(condition){ exec.execute(new Runnable() {
java.util.concurrent.ExecutorService
是否应该在所有任务完成或取消后关闭
我有这样一种方法:
public void testProxies() {
// 5 thread
ExecutorService exec = Executors.newFixedThreadPool(5);
try {
while(condition){
exec.execute(new Runnable() {
@Override
public void run() {
//some task
}
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
exec.shutdown();// should be shutdown here?
}
}
这是使用执行器服务的当前方式吗
如何重用执行器服务
ExecutorService
应该关闭还是放手?是。如果您没有,ExecutorService应该关闭;我不想再执行任何任务了。- 如果你关闭它,你就不能再使用它
- 如果您不关闭它,您的程序将无法退出,因为将有活动的非守护进程线程
shutdown
,让程序退出,但只有在您知道不需要向执行者提交额外任务时
我通常做的是:
- 我使执行者服务成为我班的一个领域
- 我提供了类的用户需要调用的
或stop
方法,该方法调用执行器的shutdown方法。请注意,在所有提交的任务完成(或成功取消)之前,执行器不会真正关闭shutdown
另一种方法是添加一个关闭钩子,当JVM退出时,它将关闭您的执行器。如果您关闭,您不能重复使用,如果您想重复使用,您可以像在代码中那样提交任务,而不使用shutdonw。我真的不同意您的看法。即使执行器中有任务运行,如果调用System.exit(),程序仍将退出。另外,当不再需要执行器时,应该调用shutdown方法,并且它不应该接受更多的任务(这并不意味着如果有正在运行的任务,它们将被终止,您的程序将很好地退出)。@AlexCalugarescu我不是这么说的
System.exit()
确实会终止程序,即使执行器未关闭,但如果关闭执行器,程序可以终止,而无需调用System.exit()
。@AlexCalugarescu和我都同意关闭不会取消正在运行的任务(shutdownNow会)-但我也没有暗示这一点。好吧,处理这种情况的一般方法是确保您的任务最终会完成,并确保为它们提供停止方法(如果可能)。我还要说,调用shutdownNow()不是一个可行的选项,因为它不能保证活动的运行线程将被停止。查看文档:@AlexCalugarescu Shutdownow将中断正在运行的任务-如果它们不响应中断,则不会发生任何事情。不知道你为什么要联系内蒂的遗嘱执行人。。。