SingleThreadExecutor VS普通线程

时间:2018-04-28 13:01:12

标签: java multithreading threadpoolexecutor

除了Executor接口比普通线程(例如管理)有一些优势之外,在执行之间是否存在任何真正的内部差异(大的性能差异,资源消耗......)

ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(runnable);

Thread thread = new Thread(runnable);
thread.start();

我这里只询问一个帖子。

4 个答案:

答案 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;:

  • 一些(潜在的)&#34;性能损失&#34;
  • 减少量的&#34;控制&#34; (这就是重点 - 你不需要处理低级细节,所以,如果你不得不,......)

主要区别在于该服务允许您提交多个任务,而该线程只能运行一个Runnable。另一方面,你必须担心诸如&#34;关闭&#34;服务。

经验法则:表现方面应该接近&#34;可忽略的&#34;这里。因此,你更喜欢&#34;更抽象的&#34;执行者服务解决方案。因为这允许您将您的顾虑与实际线程分开。更重要的是:如果您选择对该服务使用不同的类型的实现......其余代码不需要关心它。

长话短说:抽象成本,但在这种情况下,你通常更喜欢&#34;更抽象的&#34;解。因为最终会降低解决方案的复杂性。

答案 2 :(得分:0)

如果您只执行一个Runnable,那么它们之间就会存在没有太大区别

使用纯线程可能会更高效,因为创建ExecutorService之类的ThreadPoolExecutor除了创建新线程之外还有其他事情可做。例如,创建阻塞队列,创建策略,尽管这些都是隐式完成的。

执行此runnable后,您必须shutdown执行程序。否则,此池中的单个线程将永远不会退出。

答案 3 :(得分:0)

主要区别在于任务执行策略。

通过创建Thread实例或子类Thread,您基本上是在执行一个任务。

另一方面,使用Executors.newSingleThreadExecutor()可以提交多个任务。由于保证了这些任务不能同时执行,因此,您可以利用以下线程限制优势:

  • 访问不是线程安全的对象时不需要同步
  • 保证一个任务的记忆效果对下一个任务可见