2011-08-23 41 views
5

约执行人最好使用一些问题的内存和时间性能:执行人使用和成本损失

  1. 有没有招致使用

    ExecutorService e = Executors.newSingleThreadExecutor(); 
    e.execute(callable) 
    e.shutdown() 
    

    任何成本损失相比:

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

  3. 如果我有几个任务,如(2)中所述,是否有任何问题与每个任务有自己的执行器服务或更好地有一个集中? (我正在谈论一个客户端应用程序,通常不会有超过一个这些任务运行)

  4. Executor消耗什么资源,如果它不关机()?

回答

6

是否有使用

ExecutorService e=Executors.newSingleThreadExecutor(); 
e.execute(callable) 
e.shutdown() 

任何成本损失相比:

new Thread(runnable).start() 

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

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

建议的使用ExecutorService的是作为一个线程池,在那里你保持ExecutorService周围,你不断提交任务,它只要你有任务提交。它可以是静态的或只是一个普通的成员,这是不相关的,高度依赖于你的需求/设计。即使您一次只运行一个实例(即,您只有一个单线程执行程序),但使用ExecutorService仍然更有效,因为它重用了该线程,所以从长远来看,它会比创建为您提交的每项任务提供一个新线程。

如果我有几个任务......每个任务都有任何问题有执行者的服务或更好地有一个集中的吗?

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

如果执行程序没有关闭(),哪些资源会消耗执行程序?

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

0

ExecutorService的要点是在固定数量的线程中共享许多任务。创建ExecutorService来运行单个任务是浪费的开销。

new Thread(runnable).start()应该总是比创建一个ExecutorService快,因为ExecutorService无论如何都会创建该线程,但会增加跟踪它的开销。