相关疑难解决方法(0)

为什么我不应该在我的类的构造函数中使用Thread.start()?

我一直在寻找理由,为什么你不应该在类的构造函数中调用线程的start方法.请考虑以下代码:

class SomeClass
{
    public ImportantData data = null;
    public Thread t = null;

    public SomeClass(ImportantData d)
    {
        t = new MyOperationThread();

        // t.start(); // Footnote 1

        data = d;

        t.start();    // Footnote 2
    }
}
Run Code Online (Sandbox Code Playgroud)

ImportantData是一些通用的东西(可能很重要),而MyOperationThread是一个知道如何处理SomeClass实例的线程的子类.

Footnodes:

  1. 我完全理解为什么这是不安全的.如果MyOperationThread在下面的语句完成之前尝试访问SomeClass.data(并且数据被初始化),我将得到一个异常,否则我没有准备好.或许我不会.你不能总是告诉线程.在任何情况下,我都会为以后的奇怪,意外行为做好准备.

  2. 我不明白为什么这样做是禁止的领土.此时,所有SomeClass的成员都已初始化,没有其他成员函数更改状态已被调用,因此构造有效地完成.

根据我的理解,这样做被认为是不好的做法的原因是你可以"泄漏对尚未完全构建的对象的引用".但是对象已经完全构造,构造函数除了返回之外没有什么可做的.我已经搜索了其他问题,寻找这个问题的更具体的答案,并且也查看了引用的材料,但没有找到任何说"你不应该因为这样和那种不良行为",只有"说"你不应该."

如何在构造函数中启动一个线程在概念上与这种情况不同:

class SomeClass
{
    public ImportantData data = null;

    public SomeClass(ImportantData d)
    {
        // OtherClass.someExternalOperation(this); // Not a good idea

        data = d;

        OtherClass.someExternalOperation(this);    // Usually accepted as OK
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,如果课程是最终的怎么办?

final class SomeClass // like this
{ …
Run Code Online (Sandbox Code Playgroud)

java multithreading constructor thread-safety

4
推荐指数
1
解决办法
808
查看次数

标签 统计

constructor ×1

java ×1

multithreading ×1

thread-safety ×1