除了Executor
接口比普通线程(例如管理)有一些优势之外,在执行之间是否存在任何真正的内部差异(大的性能差异,资源消耗......)
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(runnable);
和
Thread thread = new Thread(runnable);
thread.start();
我这里只询问一个帖子。
答案 0 :(得分:6)
执行人#newSingleThreadExecutor()在引擎盖下创建 ThreadPoolExecutor 对象,
请参阅此处的代码:http://www.docjar.com/html/api/java/util/concurrent/Executors.java.html
133 public static ExecutorService newSingleThreadExecutor() {
134 return new FinalizableDelegatedExecutorService
135 (new ThreadPoolExecutor(1, 1,
136 0L, TimeUnit.MILLISECONDS,
137 new LinkedBlockingQueue<Runnable>()));
138 }
documentation of ThreadPoolExecutor解释了它在哪些情况下具有优势:
线程池解决了两个不同的问题:它们通常提供的 在执行大量异步时提高了性能 任务,由于减少了每个任务的调用开销,并且它们提供了一个 绑定和管理资源的方法,包括线程, 在执行任务集合时消耗。每个ThreadPoolExecutor 还保留了一些基本的统计数据,比如已完成的数量 任务。
如果你需要的只是偶尔运行一次单线程(比如一小时一次),那么就性能而言,使用ThreadPoolExecutor
可能会更慢,因为你需要实例化整个机器( pool + thread),然后把它从内存中扔掉。
但是如果你想经常使用这个单线程(比如说每15秒),那么优点是你创建了池和线程只有一次,将它保存在内存中,然后全部使用它节省时间创建一个新线程的时间(这可能是相当昂贵的,如果你想使用它说每15秒左右)。
答案 1 :(得分:2)
这是一个抽象,那些总是来自&#34;成本&#34;:
主要区别在于该服务允许您提交多个任务,而该线程只能运行一个Runnable。另一方面,你必须担心诸如&#34;关闭&#34;服务。
经验法则:表现方面应该接近&#34;可忽略的&#34;这里。因此,你更喜欢&#34;更抽象的&#34;执行者服务解决方案。因为这允许您将您的顾虑与实际线程分开。更重要的是:如果您选择对该服务使用不同的类型的实现......其余代码不需要关心它。
长话短说:抽象成本,但在这种情况下,你通常更喜欢&#34;更抽象的&#34;解。因为最终会降低解决方案的复杂性。
答案 2 :(得分:0)
如果您只执行一个Runnable
,那么它们之间就会存在没有太大区别。
使用纯线程可能会更高效,因为创建ExecutorService
之类的ThreadPoolExecutor
除了创建新线程之外还有其他事情可做。例如,创建阻塞队列,创建策略,尽管这些都是隐式完成的。
执行此runnable后,您必须shutdown
执行程序。否则,此池中的单个线程将永远不会退出。
答案 3 :(得分:0)
主要区别在于任务执行策略。
通过创建Thread
实例或子类Thread
,您基本上是在执行一个任务。
另一方面,使用Executors.newSingleThreadExecutor()
可以提交多个任务。由于保证了这些任务不不能同时执行,因此,您可以利用以下线程限制优势: