Executor看起来像是一个干净的抽象层。但什么情况下您会想要直接使用Thread,而不是依赖更健壮的executor呢?
Executor看起来像是一个干净的抽象层。但什么情况下您会想要直接使用Thread,而不是依赖更健壮的executor呢?
从历史上看,执行器(Executors)仅在Java 1.5中作为Java标准的一部分添加。因此,在某些方面,可以将执行器视为处理可运行任务的新型更好抽象。
有点过于简化了... - 执行器是正确使用线程的方式,因此请优先使用它们。
使用原始线程没有任何优势。您可以始终向执行程序提供一个线程工厂,因此即使是自定义线程创建选项也已经涵盖。
java.util.concurrent包提供了Executor接口,可用于创建线程。
Executor接口提供了一个单独的方法execute,旨在成为常见的线程创建构造的替代品。如果r是Runnable对象,e是Executor对象,您可以将
(new Thread(r)).start();
替换为
e.execute(r);
参考此处
除非你需要Thread本身没有的更具体的行为,否则不要使用Thread。然后扩展Thread并添加你想要的特定行为。
否则,只需使用Runnable或Executor。
即使只有单个线程,也最好使用Executor而不是Thread
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);
以下情况下,您可以在Executor
之上使用Thread
:
您的应用程序需要有限的线程,并且业务逻辑很简单
如果简单的多线程模型满足您的需求而不需要线程池
您有信心通过低级API在以下领域管理线程的生命周期+异常处理场景:线程间通信、异常处理、线程的重启
由于意外错误
最后一点
If your application does not need customization of various features of ThreadPoolExecutor
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler)
在其他所有情况下,您可以选择使用 ThreadPoolExecutor