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将中断正在运行的任务-如果它们不响应中断,则不会发生任何事情。不知道你为什么要联系内蒂的遗嘱执行人。。。