您是否应始终使用ExecutorService而不是启动自己的线程?

在JDK> = 1.5的情况下,启动线程的首选方法应该始终是Executor还是Executor Service,或者如果您不需要ExecutorService提供的内容,是否还有理由更喜欢使用Thread.start?

对于同步,我曾经认为使用新的Lock实现是首选,直到我另外解释 。 所以我想知道关于执行者的同样的事情。 它们只是处理更复杂案例的一种方式,还是应该成为标准选择?

就个人而言,自从Java 5以来,我完全离开了ThreadThreadGroup ,因为它们比ExecutorService提供的定制和function更少。

当使用ExecutorService ,我知道我可以使用Callable ,我知道我可以(带一点开销)安排重复任务。 因此,我考虑直接实例化Thread对象弃用的代码,如VectorHashtable

Java Concurrency in Practice至少在第6.2节中明确说明:

Java类库中任务执行的主要抽象不是 Thread ,而是Executor 。 […]

使用Executor通常是在应用程序中实现生产者 – 消费者设计的最简单途径。

编写正确的multithreading代码非常困难。 Executor框架的优点在于它实现了开发人员将遇到的大部分繁重工作,并且只需要实现Callable或Future并编程到java.util.concurrent API。 恕我直言,由于正确管理线程的复杂性,它导致代码更易读,并且错误地实现它的机会更少。