2011-05-06 98 views
5

这是我如何定义我的线程如何获得线程的状态?

public class Countdown implements Runnable{ 

    public Countdown(){ 
     new Thread(this).start(); 
    } 

    //... 
} 

这还算是可能的,如果是就这样开始了得到一个线程的状态?像

Countdown cd = new Countdown(); 
cd.getState(); 

回答

5

不是。

如果你想获得状态,你必须保持对线程的引用;例如

public class Countdown implements Runnable{ 
    private final Thread t; 

    public Countdown(){ 
     t = new Thread(this); 
     t.start(); 
    } 

    public Thread.State getState() { 
     return t.getState(); 
    } 
    // ... 
} 

顺便说一句,还有其他原因,这是不是一个伟大的格局:

  • 如果到Countdown对象的引用丢失(例如,由于施工过程中发生异常的父对象),你将泄漏一个线程。

  • 线程和线程创建消耗大量资源。如果这些对象中有很多,或者它们的寿命较短,那么最好使用线程池。

+1

我会做主题'final'。 ;) – 2011-05-06 08:52:58

3

你可以做

public class Countdown implements Runnable{ 
    private final Thread thread; 
    public Countdown(){ 
     (thread = new Thread(this)).start(); 
    } 

    public Thread.State getState() { 
     return thread.getState(); 
    } 
} 
2

,因为它是唯一实现Runnable你必须提供一个包装方法来获取状态:

class Countdown implements Runnable { 
    private final Thread thread; 

    public Countdown() { 
     thread = new Thread(this); 
     thread.start(); 
    } 

    public Thread.State getState() { 
     return thread.getState(); 
    } 
} 
+0

伟大的思想...... – 2011-05-06 08:38:54

+0

我看到你把两条线合并成一条线,但没有想过在这种情况下使用它。 – WhiteFang34 2011-05-06 08:43:11

1

遗憾地说,但你应该从不从构造函数启动线程。那个建筑师正在乞求问题。更改以便Countdown的实例化程序创建线程。

+0

我不认为在构造函数中启动线程并不总是坏事。尽管如此,你一定要小心,确保在构造函数的末尾启动它。有关为什么它可能是一个不好的做法,请参阅http://www.ibm.com/developerworks/java/library/j-jtp0618/index.html – WhiteFang34 2011-05-06 08:48:02

+1

还有其他原因为什么你不应该创建一个线程在构造函数中,特别是OP发布的代码。该类正在实现,从而将自身暴露为Runnable。这表明其他开发人员应该开始/创建线程。如果有人将发布的代码进行子类化,他也可能会陷入麻烦。 – Kaj 2011-05-06 08:54:49

1

我建议使用run()方法并在那里指定正在运行的线程,否则在c-tor中。 沿线的东西。

public class Countdown implements Runnable{ 
volatile Object thread = State.NEW; 
public void run(){ 
    this.thread = Thread.currentThread(); 
    try{ 
///.... 
    }finally{ 
    this.thread = State.TERMINATED; 
    } 

} 

State getState(){ 
    Object t=this.thread; 
    return t instanceof State?((State)t):((Thread)t).getState(); 
} 

}