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

在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()?

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

创建新线程非常昂贵。 因为Executors使用线程池,所以您可以轻松地重用线程,从而获得更好的性能。

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

Executors#newFixedThreadPool(int)Executors#newSingleThreadExecutor执行此操作,每个Executors#newSingleThreadExecutor不同的条款(阅读正确的javadoc以了解更多信息)。

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

如果不是它只是一种方法来避免每次都要编写新的Thread(runnable).start()?

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

线程有多个问题。

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

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

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

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

例如,我正在替换使用在具有自定时器的循环中运行的不相交线程的遗留代码,以确定每次迭代后Thread.sleep()应该多长时间。 我的替换将使用一个非常简单的Runnable(用于保存单个迭代),一个ScheduledExecutorService用于运行迭代之一,而Future用于scheduleAtAFixedRate方法来调整迭代之间的时间。

虽然你可以说替换将有效地等同于遗留代码,但我已经用一系列function划分了线程管理和一厢情愿的想法,这些function将GUI的关注点分开(我们目前正在运行吗?)数据处理(以5倍速播放)和文件管理(取消此运行并选择另一个文件)。