2013-01-03 25 views
0

我怀疑java.util.concurrent.ExecutorService是否应在所有任务完成或取消后关闭?java.util.concurrent.ExecutorService应该以java.sql.Connection的形式关闭吗?

我有这样的方法:

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应该关机还是放手吧?

回答

1
  • 如果关闭它,则无法重复使用。
  • 如果你没有关闭它,你的程序将不能退出,因为会有非守护进程线程。

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

我一般做:

  • 我做的ExecutorService我的类的字段
  • 我提供了一个stopshutdown方法,我的类的用户需要调用它调用的关机方法遗嘱执行人。请注意,在所有提交的任务完成(或已被成功取消)之前,执行程序不会实际关闭。

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

+1

我不完全同意你的看法。即使执行程序中有任务正在运行,如果调用System.exit(),程序仍然会退出。当执行器不再需要时,也应该调用shutdown方法,并且它不应该接受更多的任务(这并不意味着如果有正在运行的任务,它们将被终止并且你的程序将很好地退出)。 –

+0

@AlexCalugarescu那不是我说的。即使执行程序未关闭,System.exit()也会终止程序,但如果关闭执行程序,则程序可以不需要System.exit()调用就终止。 – assylias

+0

@AlexCalugarescu我同意关机不会取消正在运行的任务(shutdownNow) - 但我并没有暗示这一点。 – assylias

1

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

+0

但是,我如何重用它? – lichengwu

+0

如果你关机,你不能重复使用,如果你想重新使用,你可以在没有关机的情况下提交你的代码。 – kosa