关于执行程序最佳使用内存和时间性能的一些问题:
使用
是否会产生任何成本罚款ExecutorService e = Executors.newSingleThreadExecutor();
e.execute(callable)
e.shutdown()
与之相比:
new Thread(runnable).start()
如果Callable
不长,并且永远不会超过一个运行它的实例,那么可以使用(1)中的代码吗?或者最好将ExecutorService
作为静态实例并在调用之间重用?
如果我有(2)中描述的几个任务,那么每个任务都有自己的执行器服务有问题,或者更好地拥有集中式服务器? (我说的是一个客户端应用程序,通常不会有多个任务在运行)
Executor
如果没有关闭()会消耗哪些资源?
答案 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无论如何都只会创建线程,但会增加跟踪它的开销。