这是我定义我的线程的方式
public class Countdown implements Runnable{
public Countdown(){
new Thread(this).start();
}
//...
}
如果以这种方式启动,是否仍然可以获得线程的状态?像
Countdown cd = new Countdown();
cd.getState();
答案 0 :(得分:6)
如果以这种方式启动线程,是否仍然可以获得线程的状态?
没有。事实并非如此。
如果你想获得状态,你必须保持对线程的引用; e.g。
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
对象的引用丢失(例如由于构造父对象时出现异常),则会泄漏一个线程。
线程和线程创建会消耗大量资源。如果有很多这些Countdown
个对象,或者它们的生命周期很短,那么你最好使用一个线程池。
答案 1 :(得分: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 :(得分: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();
}
}
答案 3 :(得分:1)
很抱歉,但是你永远不应该从构造函数中启动一个线程。那个建筑师正在乞求问题。更改,以便Countdown的实例化器创建线程。
答案 4 :(得分: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();
}
}