在构造函数中启动一个线程

时间:2012-06-08 08:36:31

标签: java concurrency

Brian Goetz's article about safe construction techniques中,您可以阅读:

  

[...]通常当一个对象拥有一个线程时,该线程是一个内部类,或者我们将这个引用传递给它的构造函数(或者类本身扩展了Thread类)。如果一个对象拥有一个线程,最好是该对象提供一个start()方法,就像Thread一样,并从start()方法而不是从构造函数启动线程。虽然这确实通过接口暴露了类的一些实现细节(例如可能存在自有线程),这通常是不可取的,但在这种情况下,从构造函数启动线程的风险超过了实现隐藏的好处。

我想使用以下代码不应该有任何问题。因为它不是内部类,也没有传递this的引用。但我想确定。

private Controller controller;
private View view;

public Facade() {
    view = new View();
    controller = new Controller(view);
    controller.start();
}

我一直在收到NetBeans警告......那么这段代码安全还是不安全?

1 个答案:

答案 0 :(得分:0)

主要原因是不在构造函数中启动线程 - 在创建“this”之前不要公开“this”(在构造函数执行之后)。在您的代码中,我没有看到如下代码:

new Thread(this);

所以应该没问题。