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发布的代码。该类正在实现,因此将自身公开为可运行的。这向其他开发人员指示他们应该启动/创建线程。如果有人对发布的代码进行子类化,他也可能会遇到麻烦。