拥有线程的对象是什么意思?

时间:2012-06-30 18:06:02

标签: java multithreading synchronization synchronized

Brian Goetz正在阅读this article。在不要从构造函数中启动线程一节下,他说“清单4中的一个特例是从构造函数中启动一个线程,因为通常当一个对象拥有一个线程时, thread是一个内部类,或者我们将this引用传递给它的构造函数(或者类本身扩展Thread类)。如果一个对象将拥有一个线程,最好是该对象提供一个start()方法,就像线程执行,并从start()方法而不是从构造函数启动线程。“他的意思是什么”通常当一个对象拥有一个线程时“?

3 个答案:

答案 0 :(得分:4)

它可以是两者之一,也可以是两者。线程由对象(java.lang.Thread类的实例)表示,该对象与其他对象的关系完全取决于您。

如果线程中运行的代码创建了一些仅由线程使用的对象,则可以将这些对象视为由线程拥有。如果你有一些其他对象负责创建,启动和控制线程,你可以将该对象视为拥有该线程。但这些东西都不是Java要求或强制执行的;在设计软件时,这是您的选择。

答案 1 :(得分:2)

Goetz的意图很简单,并不是Thread特有的。它只是意味着一个对象通过组合关系拥有Thread实例 - 它拥有对它的私有引用,并且不允许任何外部对象访问它。

您还可以注意到,这种所有权并不是真正可执行的,因为在该线程上执行的任何代码也可以通过Thread方法访问currentThread实例。

答案 2 :(得分:1)

我不认为Goetz意味着对于拥有一个线程的对象过于字面意义。他只是意味着线程是在其他对象的构造函数中启动的,所以它可以在它有机会完成构造之前访问该对象的状态。没有正式的,有意义的所有权关系,这完全是背景。例如,您可能会说谁拥有对该线程的引用是所有者,因为他们可以取消它,但引用可以传递,对于首先创建该线程的对象没有什么特别的。

如果您阅读Goetz的书 Java Concurrency in Practice ,它涵盖了thread confinement等设计技术,其中线程与之交互的范围受到限制。您还可以创建对象,以便只有一个线程可以看到它们,例如使用ThreadLocal时。因此,您可以设计您的抽象来创建所有权关系,但这取决于您。