2021-04-18 11:25  阅读(70)
文章分类:Java 基础教程 文章标签:JavaJava 教程
©  原文作者:w3cschool 原文地址:https://www.w3cschool.cn/java/java-thread-multiple.html

Java线程教程 - Java线程生命周期

线程总是处于以下六种状态之一:

  • New
  • Runnable
  • Blocked
  • Waiting
  • Timed-waiting
  • Terminated

线程的所有这些状态都是JVM状态。

当一个线程被创建并且它的start()方法还没有被调用时,它处于新的状态。

    Thread  t = new MyThreadClass(); // t is in the   new state
    

准备运行或运行的线程处于可运行状态。

如果线程尝试输入或重新输入同步的方法或块,但该监视器正在被另一个线程使用,则该线程处于阻塞状态。

状态转换

线程可以通过调用下表中列出的方法将自身置于等待状态。

方法 描述
wait() 从Object类。
join() 从Thread类。
park() 从java.util.concurrent.locks.LockSupport类。调用此方法的线程可以通过调用线程上的unpark()方法等待直到许可可用。

线程可以通过调用下表中列出的方法将自身置于等待等待状态。

描述 描述
sleep() 从Thread类。
wait(longmillis)wait(longmillis,intnanos) 从Object类。
join(longmillis)join(longmillis,intnanos) 从Thread类。
parkNanos(longnanos)parkNanos(Objectblocker,longnanos) 从LockSupport类,它在java.util.concurrent.locks包中。
parkUntil(longdeadline)parkUntil(Objectblocker,longnanos) 从LockSupport类,它在java.util.concurrent.locks包中。

已完成其执行的线程处于终止状态。

终止的线程不能转换到任何其他状态。

例子

我们可以使用一个线程的isAlive()方法,在它已经启动后,知道它是否存活或终止。

我们可以使用Thread类中的getState()方法来随时获取线程的状态。

此方法返回Thread.State枚举类型的常量之一。

以下代码演示了线程从一个状态到另一个状态的转换。

    class ThreadState extends Thread {
      private boolean keepRunning = true;
      private boolean wait = false;
      private Object syncObject = null;
    
      public ThreadState(Object syncObject) {
        this.syncObject = syncObject;
      }
      public void run() {
        while (keepRunning) {
          synchronized (syncObject) {
            if (wait) {
              try {
                syncObject.wait();
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
            }
          }
        }
      }
    
      public void setKeepRunning(boolean keepRunning) {
        this.keepRunning = keepRunning;
      }
    
      public void setWait(boolean wait) {
        this.wait = wait;
      }
    }
    
    public class Main {
      public static void main(String[] args) throws InterruptedException {
        Object syncObject = new Object();
        ThreadState ts = new ThreadState(syncObject);
        System.out.println("Before start()-ts.isAlive():" + ts.isAlive());
        System.out.println("#1:" + ts.getState());
    
        ts.start();
        System.out.println("After start()-ts.isAlive():" + ts.isAlive());
        System.out.println("#2:" + ts.getState());
        ts.setWait(true);
    
        Thread.currentThread().sleep(100);
    
        synchronized (syncObject) {
          System.out.println("#3:" + ts.getState());
          ts.setWait(false);
          syncObject.notifyAll();
        }
    
        Thread.currentThread().sleep(2000);
        System.out.println("#4:" + ts.getState());
        ts.setKeepRunning(false);
    
        Thread.currentThread().sleep(2000);
        System.out.println("#5:" + ts.getState());
        System.out.println("At the   end. ts.isAlive():" + ts.isAlive());
      }
    }
    

上面的代码生成以下结果。

20210418112110_1.png

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> Java 线程生命周期
上一篇
Java 线程加入
下一篇
Java 线程优先级