执行人员使用和成本惩罚

时间:2011-08-23 20:08:00

标签: java concurrency

关于执行程序最佳使用内存和时间性能的一些问题:

  1. 使用

    是否会产生任何成本罚款
    ExecutorService e = Executors.newSingleThreadExecutor();
    e.execute(callable)
    e.shutdown()
    

    与之相比:

    new Thread(runnable).start()
    
  2. 如果Callable不长,并且永远不会超过一个运行它的实例,那么可以使用(1)中的代码吗?或者最好将ExecutorService作为静态实例并在调用之间重用?

  3. 如果我有(2)中描述的几个任务,那么每个任务都有自己的执行器服务有问题,或者更好地拥有集中式服务器? (我说的是一个客户端应用程序,通常不会有多个任务在运行)

  4. Executor如果没有关闭()会消耗哪些资源?

2 个答案:

答案 0 :(得分:6)

  

使用

是否有任何成本损失
ExecutorService e=Executors.newSingleThreadExecutor();
e.execute(callable)
e.shutdown()
  

与之相比:

new Thread(runnable).start()

是的,存在“惩罚”:ExecutorService创建的成本可能更高,因为它还为您提交的任务创建了一个队列,如果线程在关闭之前失败,那么失败的线程将被另一个替换,以便运行任何后续任务(因此有相当多的逻辑)。但是,您可能不希望每次要运行任务时都创建ExecutiveService ...这可能不是ExecutorService的最佳用法(在下一个问题中更多内容)

  

如果Callable不是一个很长的,并且永远不会运行多个实例,那么可以使用-1-中的代码?或者最好将ExecutorService作为静态服务并在调用之间重用?

建议使用ExecutorService作为一个线程池,您可以保留ExecutorService,只要您有要提交的任务,就可以继续向其提交任务。它可以是静态的,也可以只是一个普通的成员,这是无关紧要的,并且高度依赖于您的要求/设计。即使您一次只运行一个实例(即您只有一个单线程执行程序),使用ExecutorService仍然更有效,因为它重用了线程,因此从长远来看它将是比为你提交的每个任务创建一个新线程便宜。

  

如果我有几项任务......对于每个任务来说,执行者服务是否有任何问题,或者更好地拥有一个集中任务?

没有问题,但效率低下,所以只需要集中执行服务。

  

如果Executor没有shutdown(),会占用哪些资源?

我认为你不应该特别担心,特别是如果你在正确的背景下使用Executor它将是最小的。

答案 1 :(得分:0)

ExecutorService的目的是在固定数量的线程之间共享许多任务。创建ExecutorService以运行单个任务是浪费的开销。

new Thread(runnable).start()应始终比创建ExecutorService更快,因为ExecutorService无论如何都只会创建线程,但会增加跟踪它的开销。