1

我目前正在阅读http://tutorials.jenkov.com/java-concurrency/creating-and-starting-threads.html中的 java 并发教程

我无法理解“子类或可运行”下的以下几行?

当 Runnable 由线程池执行时,很容易将 Runnable 实例排队,直到池中的线程空闲。

4

4 回答 4

1

正如文章指出的那样,它们都“工作”,尽管一般来说,您应该使用(或者如果需要使用 aRunnable参数/结果)而不是子类化。正如您所指出的,这更加灵活 - 它将执行的内容与执行的人分开。扩展 Thread 不必要地将这两个概念在同一个实例中紧密耦合在一起,打破了单一职责的 OO 原则。CallableFutureThread

有时,当您的手被 API 强制时,您必须将可执行代码实现为 Thread 的子类。例如,运行时。addShutdownHook(Thread)要求您在关机时执行的代码注册为 Thread 实例。但是,如果您不处理这些特定情况之一,那么请始终使用Runnable.

于 2011-04-17T05:52:41.397 回答
0

作者只是想传达,根据他的说法,Runnables 更容易与线程池一起使用。线程池的一个概念是您可以有固定数量的线程(比如 10 个)等待接受作业。如果所有 10 个线程都忙于运行线程,则可以将未完成的工作排队,直到池中的这些线程之一空闲。

于 2011-04-17T05:52:49.837 回答
0

Jenkov 正在强调,在 Subclass 或 Runnable 实现之间进行选择是由于偏好(如果有的话)。

他以线程池模式为例,说明为什么可运行接口实现更加灵活。我支持他原来的假设,但主要是因为 Runnable 对象可以继承 Thread 以外的一个类。

我不太明白,使用Java本机库即线程子类构建线程池会变得更加麻烦。 java.util.concurrent.ThreadPoolExecutor。我希望 Jenkov 能提供一个例子……

于 2011-04-17T06:06:30.877 回答
0

Jenkov 在他的并发教程中进一步描述了使用 ExecutorService 工厂方法的固定和缓存线程池。看看这里:http ://tutorials.jenkov.com/java-util-concurrent/executorservice.html 。使用创建这些线程池的 Java 并发实用程序,使用可运行对象更容易。

于 2015-04-09T18:57:01.480 回答