执行程序优于新线程的优点

时间:2013-08-28 19:46:00

标签: java multithreading threadpool executorservice

在Java程序中使用Executors而不仅仅是Threads有什么好处。

ExecutorService pool = Executors.newFixedThreadPool(2);
void someMethod() {
    //Thread
    new Thread(new SomeRunnable()).start();

    //vs

    //Executor
    pool.execute(new SomeRunnable());
}

执行程序是否只限制允许一次运行的线程数(线程池)?它是否实际上将runnable复用到它创建的线程上?如果不是,它只是一种避免每次都必须编写新的Thread(runnable).start()的方法吗?

5 个答案:

答案 0 :(得分:7)

是的,执行者通常会将runnable复用到他们创建的线程上;他们会限制和管理一次运行的线程数量;他们会更容易定制并发级别。通常,执行程序应该优先于创建裸线程。

答案 1 :(得分:5)

创建新线程非常昂贵。因为Executors使用线程池,所以可以轻松地重用线程,从而提高性能。

答案 2 :(得分:2)

  

执行程序是否只限制允许一次运行的线程数(线程池)?

Executors#newFixedThreadPool(int)Executors#newSingleThreadExecutor执行此操作,每个人都使用不同的术语(阅读正确的javadoc以了解更多信息)。

  

它是否实际上将runnable复用到它创建的线程上?

  

如果不是,它只是一种避免每次都必须编写新线程(可运行).start()的方法吗?

ExecutorService可帮助您控制处理线程的方式。当然,您可以手动执行此操作,但无需重新发明轮子。此外,ExecutorService还提供了其他功能,可以通过使用Future实例来执行异步任务。

答案 3 :(得分:0)

有多个与线程相关的问题。

  • 管理线程
  • 资源利用率
  • 创建线程

Executors提供了用于创建线程池的不同类型的实现。线程创建也是一件昂贵的事情。执行程序在内部创建和管理这些线程。有关它的详细信息可以在下面的链接中找到。 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html

答案 4 :(得分:-1)

正如我在a related question中所说,线程非常糟糕。执行程序(以及相关的并发类)非常好:

  

警告:在这里,我强烈反对使用原始线程。一世   更喜欢使用Callables和FutureTasks(来自javadoc:“A   可取消的异步计算“)。超时的集成,   正确的取消和现代并发的线程池   支持对我来说比成堆的原始线程更有用。

例如,我正在使用自定义替换使用在循环中运行的不相交Thread的遗留代码,以确定每次迭代后Thread.sleep()应该多长时间。我的替换将使用非常简单的Runnable(进行单次迭代),ScheduledExecutorService运行其中一次迭代,Future生成scheduleAtAFixedRate来调整迭代之间的时间

虽然您可能会认为替换将有效地等同于遗留代码,但我将用一系列分离GUI关注点的功能替换一个神秘的线程管理和一厢情愿的想法(我们目前正在运行) ?)来自数据处理(以5倍速播放)和文件管理(取消此运行并选择另一个文件)。