什么时候应该使用Java的Thread over Executor?

执行者似乎是一个干净的抽象。 你想什么时候直接使用Thread而不是依赖更强大的执行器?

为了提供一些历史logging,Executors仅作为Java 1.5中的Java标准的一部分添加。 所以在某些方面,执行者可以被看作是处理Runnable任务的一个新的更好的抽象。

一些过于简单化… – 执行程序是正确的线程,所以优先使用它们。

当我需要一些基于拉的消息处理时,我使用线程。 例如,一个队列是一个单独的线程中的循环()。 例如,你在一个昂贵的上下文中包装了一个队列 – 可以说一个JDBC连接,JMS连接,从单个磁盘处理的文件等等。

在我受到诅咒之前,你有一些情景吗?

编辑

正如其他人所说的那样, ExecutorExecutorService )接口具有更多的潜力,因为您可以使用Executors来select一个行为:在Java 5+或Java 1.4的juc backport中进行计划,优先级sorting,caching等。

执行器框架具有针对运行崩溃的保护,并自动重新创build工作线程。 我认为的一个缺点是,在退出应用程序之前,您必须显式shutdown()awaitTermination() ,这在GUI应用程序中并不那么容易。 如果使用有界队列,则需要指定RejectedExecutionHandler或将新的runnables丢弃。

您可能会看看Brian Goetz et al:Java Concurrency in Practice(2006)

使用原始线程没有任何优势。 您可以随时为执行程序提供一个线程工厂,因此即使是自定义线程创build的选项也是如此。

除非您需要更多在线程中找不到的特定行为,否则不要使用线程。 然后,您扩展线程并添加您特别想要的行为。

否则只使用Runnable或Executor。

那么,我认为一个ThreadPoolExecutor提供了更好的性能,它pipe理线程池,最小化实例化一个新的线程,分配内存的开销…

如果你要启动数千个线程,它会给你一些你自己编程的排队function。

线程和执行程序是不同的工具,用于不同的场景…就像我看到它,就像问我为什么要使用ArrayList,当我可以使用HashMap? 他们是不同的…

java.util.concurrent包提供了executor接口,可以用来创build线程。

Executor接口提供了一个单一的方法,执行,devise成一个普通的线程创build习惯用语的替代。 如果r是一个Runnable对象,并且e是Executor对象,则可以replace

(new Thread(r))。start();

e.execute(R);

请参阅这里

即使对于单线程,如下所示,selectExecutor也是更好的select

 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1); 

您可以在下面的情况下使用Thread Executor

  1. 您的应用程序需要有限的线程和业务逻辑非常简单

  2. 如果简单的multithreading模型满足您的需求而不需要线程池

  3. 您有信心通过以下方面的低级API帮助pipe理线程生命周期+exception处理场景: Inter thread communication, Exception handling, reincarnation of threads由于意外错误导致Inter thread communication, Exception handling, reincarnation of threads

还有最后一点

  1. 如果您的应用程序不需要定制ThreadPoolExecutor的各种function

     ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 

在所有其他情况下,您可以使用ThreadPoolExecutor