0

我怀疑是否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?

ExecutorService应该关机还是放手?

4

2 回答 2

1

是的。如果您不想再执行任何任务,应该关闭 ExecutorService。

于 2013-01-03T05:44:46.670 回答
1
  • 如果你关闭它,你就不能重复使用它。
  • 如果您不将其关闭,您的程序将无法退出,因为会有实时的非守护线程。

所以你需要shutdown在某个阶段调用让你的程序退出,但前提是你知道你不需要向你的执行者提交额外的任务。

我一般做什么:

  • 我使 ExecutorService 成为我班级的一个领域
  • 我提供了一个stoporshutdown方法,我的类的用户需要调用它来调用执行器的关闭方法。请注意,在所有提交的任务完成(或已成功取消)之前,执行程序实际上不会关闭。

另一种方法是添加一个关闭钩子,它将在 JVM 退出时关闭您的执行程序。

于 2013-01-03T05:44:59.087 回答