对象拥有线程是什么意思



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

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

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

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

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

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

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

最新更新