多线程-我们什么时候应该使用Java的Thread over Executor?

执行器似乎是干净的抽象。 您何时想直接使用Thread而不是依赖更强大的执行程序?

ripper234 asked 2020-01-14T12:57:27Z
7个解决方案
30 votes

为了提供一些历史记录,仅在Java 1.5中将Executors作为Java标准的一部分添加。 因此,在某些方面,执行程序可以看作是处理Runnable任务的新的更好的抽象方法。

有点过分简化了...-执行器执行正确,因此优先使用它们。

Pablojim answered 2020-01-14T12:57:52Z
7 votes

当我需要基于拉的消息处理时,我使用线程。 例如。 在单独线程中的循环中,将一个take()-en用作队列。 例如,您在昂贵的上下文中包装队列-假设JDBC连接,JMS连接,要从单个磁盘处理的文件等。

在我被诅咒之前,您有什么情况吗?

编辑:

如其他人所述,shutdown()awaitTermination())接口具有更大的潜力,因为您可以使用RejectedExecutionHandler选择行为:Java 5+中的计划,优先级,缓存等,或Java 1.4的j.u.c backport。

执行程序框架可以防止崩溃的可运行对象并自动重新创建工作线程。 我认为一个缺点是,您必须在退出应用程序之前显式地将它们shutdown()awaitTermination()进行替换-在GUI应用程序中这并不容易。如果使用有界队列,则需要指定RejectedExecutionHandler,否则新的可运行对象将被丢弃。

您可以看看Brian Goetz等人:《 Java Concurrency in Practice》(2006年)。

akarnokd answered 2020-01-14T12:58:36Z
5 votes

使用原始线程没有任何优势。 您始终可以为执行者提供线程工厂,因此甚至涵盖了自定义线程创建的选项。

skaffman answered 2020-01-14T12:58:56Z
3 votes

除非您需要Thread本身未提供的更多特定行为,否则不要使用Thread。 然后,您扩展线程并添加您特别想要的行为。

否则,请使用Runnable或Executor。

nojevive answered 2020-01-14T12:59:20Z
3 votes

好吧,我认为ThreadPoolExecutor可管理线程池,从而提供了更好的性能,从而最大限度地减少了实例化新线程,分配内存的开销。

而且,如果您要启动成千上万的线程,它将为您提供一些排队功能,您必须自己编程...

线程和执行器是不同的工具,用在不同的场景中...正如我所看到的,就像在问为什么可以使用HashMap时为什么应该使用ArrayList? 他们是不同的...

SoulWanderer answered 2020-01-14T12:59:49Z
3 votes

java.util.concurrent包提供了执行程序接口,可用于创建线程。

Executor接口提供了一种执行方法,旨在替代常用的线程创建习惯用法。 如果r是Runnable对象,而e是Executor对象,则可以替换

(新线程(r))。start();

e.execute(r);

请参考这里

challenger answered 2020-01-14T13:00:32Z
2 votes

即使对于如下所示的单线程,最好还是使用Executor而不是ThreadPoolExecutor

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);

在以下情况下,可以在Executor上使用ThreadPoolExecutor

  1. 您的应用程序需要有限的线程,并且业务逻辑很简单

  2. 如果简单的多线程模型在没有线程池的情况下可以满足您的要求

  3. 您有信心借助以下区域的低级API来管理线程的生命周期和异常处理方案:ThreadPoolExecutor由于意外错误

最后一点

  1. 如果您的应用程序不需要自定义ThreadPoolExecutor的各种功能

    ThreadPoolExecutor

在其他所有情况下,您都可以申请ThreadPoolExecutor

ravindra answered 2020-01-14T13:01:27Z
translate from https://stackoverflow.com:/questions/1094867/when-should-we-use-javas-thread-over-executor