18

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

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

    //vs

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

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

4

5 回答 5

7

是的,执行程序通常会将可运行文件多路复用到它们创建的线程上;他们将限制和管理一次运行的线程数;它们将使自定义并发级别变得更加容易。一般来说,执行器应该比仅仅创建裸线程更受欢迎。

于 2013-08-28T19:52:55.750 回答
5

创建新线程的成本很高。因为 Executors 使用线程池,您可以轻松地重用线程,从而获得更好的性能。

于 2013-08-28T19:54:15.520 回答
2

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

Executors#newFixedThreadPool(int)Executors#newSingleThreadExecutor请按照不同的术语执行此操作(阅读正确的 javadoc 以了解更多信息)。

它实际上是否将可运行对象多路复用到它创建的线程上?

是的

如果不是,它只是一种避免每次都写 new Thread(runnable).start() 的方法吗?

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

于 2013-08-28T19:55:26.820 回答
0

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

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

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

于 2013-09-02T14:42:43.763 回答
-1

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

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

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

虽然您可能会争辩说替换将有效地等同于遗留代码,但我将用一组分隔的功能来替换线程管理和一厢情愿的神秘咆哮,这些功能将 GUI(我们当前正在运行吗?)的关注点与数据处理(以 5 倍速度播放)和文件管理(取消此运行并选择另一个文件)。

于 2013-08-28T20:06:56.677 回答