Java 如何获取线程的状态?
这就是我定义线程的方式Java 如何获取线程的状态?,java,multithreading,Java,Multithreading,这就是我定义线程的方式 public class Countdown implements Runnable{ public Countdown(){ new Thread(this).start(); } //... } 如果线程以这种方式启动,是否仍然可以获取线程的状态?像 Countdown cd = new Countdown(); cd.getState(); 如果线程以这种方式启动,是否仍然可以获取线程的状态 不,不是 如果你想获得
public class Countdown implements Runnable{
public Countdown(){
new Thread(this).start();
}
//...
}
如果线程以这种方式启动,是否仍然可以获取线程的状态?像
Countdown cd = new Countdown();
cd.getState();
如果线程以这种方式启动,是否仍然可以获取线程的状态
不,不是
如果你想获得状态,你必须保持对线程的引用;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
- 你可以
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();
}
}
很抱歉,但是您不应该从构造函数启动线程。那个建筑工人在乞求麻烦。更改以使倒计时的实例化器正在创建线程。我建议使用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();
}
}我看到您将两行合并为一行,以前没有想过在这种情况下使用它。我不认为在构造函数中启动线程总是不好的。但是,您必须小心,确保在构造函数末尾启动它。关于为什么这可能是一种不好的做法的参考,请参见不应该在构造函数中创建线程的其他原因,尤其是OP发布的代码。该类正在实现,因此将自身公开为可运行的。这向其他开发人员指示他们应该启动/创建线程。如果有人对发布的代码进行子类化,他也可能会遇到麻烦。