执行者看起来像一个干净的抽象。您何时想直接使用Thread而不是依赖更强大的执行程序?
答案 0 :(得分:30)
为了给出一些历史记录,Executors仅作为Java 1.5中java标准的一部分添加。因此,在某些方面,Executors可以被视为处理Runnable任务的新的更好的抽象。
有点过分简化...... - 执行者是正确的线程,所以优先使用它们。
答案 1 :(得分:7)
当我需要一些基于拉的消息处理时,我使用Thread。例如。一个队列是take() - en在一个单独的线程中的循环中。例如,您将队列包装在昂贵的上下文中 - 比如说JDBC连接,JMS连接,要从单个磁盘处理的文件等等。
在我受到诅咒之前,你有一些情景吗?
修改:
正如其他人所说,Executor
(ExecutorService
)接口具有更大的潜力,因为您可以使用Executors
来选择行为:Java中的计划,优先级,缓存等用于Java 1.4的5+或juc backport。
执行程序框架可以防止崩溃的runnables并自动重新创建工作线程。我认为一个缺点是,在退出应用程序之前必须明确shutdown()
和awaitTermination()
- 这在GUI应用程序中并不那么容易。
如果你使用有界队列,你需要指定一个RejectedExecutionHandler
或者新的runnables被扔掉。
答案 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)
首选Executor至Thread
总是更好,即使是单线程,如下所示
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);
您可以在以下方案中使用Thread
而不是Executor
您的应用程序需要有限的线程,业务逻辑很简单
如果简单的多线程模型满足您的要求而没有线程池
您有信心通过以下方面的低级API管理线程生命周期+异常处理方案:由于意外错误导致Inter thread communication, Exception handling, reincarnation of threads
和最后一点
如果您的应用不需要自定义ThreadPoolExecutor
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler)
在所有其他情况下,您可以选择ThreadPoolExecutor