Brian Goetz正在阅读this article。在不要从构造函数中启动线程一节下,他说“清单4中的一个特例是从构造函数中启动一个线程,因为通常当一个对象拥有一个线程时, thread是一个内部类,或者我们将this引用传递给它的构造函数(或者类本身扩展Thread类)。如果一个对象将拥有一个线程,最好是该对象提供一个start()方法,就像线程执行,并从start()方法而不是从构造函数启动线程。“他的意思是什么”通常当一个对象拥有一个线程时“?
答案 0 :(得分:4)
它可以是两者之一,也可以是两者。线程由对象(java.lang.Thread
类的实例)表示,该对象与其他对象的关系完全取决于您。
如果线程中运行的代码创建了一些仅由线程使用的对象,则可以将这些对象视为由线程拥有。如果你有一些其他对象负责创建,启动和控制线程,你可以将该对象视为拥有该线程。但这些东西都不是Java要求或强制执行的;在设计软件时,这是您的选择。
答案 1 :(得分:2)
Goetz的意图很简单,并不是Thread
特有的。它只是意味着一个对象通过组合关系拥有Thread
实例 - 它拥有对它的私有引用,并且不允许任何外部对象访问它。
您还可以注意到,这种所有权并不是真正可执行的,因为在该线程上执行的任何代码也可以通过Thread
方法访问currentThread
实例。
答案 2 :(得分:1)
我不认为Goetz意味着对于拥有一个线程的对象过于字面意义。他只是意味着线程是在其他对象的构造函数中启动的,所以它可以在它有机会完成构造之前访问该对象的状态。没有正式的,有意义的所有权关系,这完全是背景。例如,您可能会说谁拥有对该线程的引用是所有者,因为他们可以取消它,但引用可以传递,对于首先创建该线程的对象没有什么特别的。
如果您阅读Goetz的书 Java Concurrency in Practice ,它涵盖了thread confinement等设计技术,其中线程与之交互的范围受到限制。您还可以创建对象,以便只有一个线程可以看到它们,例如使用ThreadLocal时。因此,您可以设计您的抽象来创建所有权关系,但这取决于您。