多线程使用线程理解Java并发性
我目前正在阅读http://tutorials.jenkov.com/java-concurrency/creating-and-starting-threads.html中的java并发教程
我无法理解“Subclass或Runnable”下面的几行内容
当线程池执行可运行实例时,很容易将可运行实例排队,直到池中的线程空闲
你可以在下面搜索框中键入要查询的问题!
我目前正在阅读http://tutorials.jenkov.com/java-concurrency/creating-and-starting-threads.html中的java并发教程
我无法理解“Subclass或Runnable”下面的几行内容
当线程池执行可运行实例时,很容易将可运行实例排队,直到池中的线程空闲
# 1 楼答案
正如文章所指出的,它们都是“有效的”,尽管在一般情况下,您应该使用
Runnable
(或者如果需要参数/结果Callable
和Future
),而不是子类化Thread
。正如您所指出的,这更灵活——它将执行的内容与执行它的人区分开来。在同一个实例中,扩展线程不必要地将这两个概念紧密地结合在一起,从而打破了single responsibility的OO原则有时,当API强制执行时,您必须将可执行代码作为线程的子类来实现。例如,运行时addShutdownHook(Thread)要求在关机时执行的代码注册为线程实例。但是,如果你没有处理这些特定的情况,那么一定要使用
Runnable
# 2 楼答案
Jenkov在并发教程中进一步介绍了使用ExecutorService工厂方法的固定线程池和缓存线程池。看看这里:http://tutorials.jenkov.com/java-util-concurrent/executorservice.html。有了创建这些线程池的Java并发实用程序,使用Runnable就更容易了
# 3 楼答案
Jenkov强调,在子类或可运行实现之间进行选择取决于偏好
他指的是thread pool pattern作为一个例子,说明为什么可运行接口实现更灵活。我支持他的原始假设,但主要是因为Runnable对象可以为Thread以外的类创建子类
我不太明白,用java本机库ie构建线程子类会多么麻烦。 java.util.concurrent.ThreadPoolExecutor。我希望Jenkov能举个例子
# 4 楼答案
作者只是想告诉大家,根据他的说法,Runnable更容易与线程池一起使用。线程池的概念是,可以有固定数量的线程(比如10个)等待执行作业。如果所有10个线程都在忙于运行线程,那么未完成的工作可以排队,直到池中的其中一个线程空闲