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

时间:2009-07-07 21:06:00

标签: java multithreading concurrency executor

执行者看起来像一个干净的抽象。您何时想直接使用Thread而不是依赖更强大的执行程序?

7 个答案:

答案 0 :(得分:30)

为了给出一些历史记录,Executors仅作为Java 1.5中java标准的一部分添加。因此,在某些方面,Executors可以被视为处理Runnable任务的新的更好的抽象。

有点过分简化...... - 执行者是正确的线程,所以优先使用它们。

答案 1 :(得分:7)

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

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

修改

正如其他人所说,ExecutorExecutorService)接口具有更大的潜力,因为您可以使用Executors来选择行为:Java中的计划,优先级,缓存等用于Java 1.4的5+或juc backport。

执行程序框架可以防止崩溃的runnables并自动重新创建工作线程。我认为一个缺点是,在退出应用程序之前必须明确shutdown()awaitTermination() - 这在GUI应用程序中并不那么容易。 如果你使用有界队列,你需要指定一个RejectedExecutionHandler或者新的runnables被扔掉。

您可以查看Brian Goetz et al: Java Concurrency in Practice (2006)

答案 2 :(得分:5)

使用原始线程没有任何优势。您始终可以为Executors提供Thread工厂,因此甚至可以选择自定义线程创建。

答案 3 :(得分:3)

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

否则只需使用Runnable或Executor。

答案 4 :(得分:3)

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

如果您要发布数千个线程,它会为您提供一些排队功能,您必须自己编程...

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

答案 5 :(得分:3)

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

Executor接口提供单个方法execute,旨在成为常见线程创建习惯用语的替代方法。如果r是Runnable对象,并且e是Executor对象,则可以替换

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

e.execute(R);

参考here

答案 6 :(得分:2)

首选ExecutorThread总是更好,即使是单线程,如下所示

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);

您可以在以下方案中使用Thread而不是Executor

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

  2. 如果简单的多线程模型满足您的要求而没有线程池

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

  4. 和最后一点

    1. 如果您的应用不需要自定义ThreadPoolExecutor

      的各种功能
      ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, 
      TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, 
      RejectedExecutionHandler handler)
      
    2. 在所有其他情况下,您可以选择ThreadPoolExecutor