【问题标题】:What does object owning a thread mean? [closed]拥有线程的对象是什么意思? [关闭]
【发布时间】:2012-07-01 20:22:45
【问题描述】:

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

【问题讨论】:

  • 你的背景是什么?它可能是任何一种方式。
  • 如果你引用Thread类的实例,它也可以是一个对象。
  • @Jeffrey 我正在阅读 Brian Goetz ibm.com/developerworks/java/library/j-jtp0618/index.html#code4 的这篇文章,在阅读“不要从构造函数中启动线程”部分时,我对对象如何拥有线程有点困惑.我认为这是相反的方式。
  • 线程并不完全由对象拥有。它们或多或少由产生它们的过程所拥有。您可以生成线程并维护线程的句柄,这可能被认为是一个对象,但它并不完全拥有线程,因为它更多的是一个引用。然而,正如杰弗里所说,这在很大程度上是由上下文决定的。您有具体的示例代码吗?
  • -1;标题没有说明一切……太模糊了。有参考吗?

标签: java multithreading synchronization synchronized


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-11
        • 2010-12-29
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-12
        • 1970-01-01
        相关资源
        最近更新 更多