如何获得线程的状态?
这是我如何定义我的线程如何获得线程的状态?
public class Countdown implements Runnable{
public Countdown(){
new Thread(this).start();
}
//...
}
这还算是可能的,如果是就这样开始了得到一个线程的状态?像
Countdown cd = new Countdown();
cd.getState();
不是。
如果你想获得状态,你必须保持对线程的引用;例如
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
对象的引用丢失(例如,由于施工过程中发生异常的父对象),你将泄漏一个线程。线程和线程创建消耗大量资源。如果这些对象中有很多,或者它们的寿命较短,那么最好使用线程池。
你可以做
public class Countdown implements Runnable{
private final Thread thread;
public Countdown(){
(thread = new Thread(this)).start();
}
public Thread.State getState() {
return thread.getState();
}
}
,因为它是唯一实现Runnable
你必须提供一个包装方法来获取状态:
class Countdown implements Runnable {
private final Thread thread;
public Countdown() {
thread = new Thread(this);
thread.start();
}
public Thread.State getState() {
return thread.getState();
}
}
伟大的思想...... – 2011-05-06 08:38:54
我看到你把两条线合并成一条线,但没有想过在这种情况下使用它。 – WhiteFang34 2011-05-06 08:43:11
遗憾地说,但你应该从不从构造函数启动线程。那个建筑师正在乞求问题。更改以便Countdown的实例化程序创建线程。
我不认为在构造函数中启动线程并不总是坏事。尽管如此,你一定要小心,确保在构造函数的末尾启动它。有关为什么它可能是一个不好的做法,请参阅http://www.ibm.com/developerworks/java/library/j-jtp0618/index.html – WhiteFang34 2011-05-06 08:48:02
还有其他原因为什么你不应该创建一个线程在构造函数中,特别是OP发布的代码。该类正在实现,从而将自身暴露为Runnable。这表明其他开发人员应该开始/创建线程。如果有人将发布的代码进行子类化,他也可能会陷入麻烦。 – Kaj 2011-05-06 08:54:49
我建议使用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();
}
}
我会做主题'final'。 ;) – 2011-05-06 08:52:58