Thread的状态

Thread几种状态

NEW(未启动状态)

Thread t = new Thread() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
};
System.out.println(t.getState().name());

RUNNABLE(可运行状态)

处于可运行状态的线程正在 Java 虚拟机中执行,但也可能是正在等待来自操作系统资源,例如 CPU。

Thread t = new Thread() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
};
t.start();
System.out.println(t.getState().name());

BLOCKED(阻塞状态)

final Object lock = new Object();

Thread t = new Thread() {
    @Override
    public void run() {
        synchronized (lock) {
            System.out.println(Thread.currentThread().getName());
        }
    }
};

synchronized (lock) {
    try {
        t.start();
        Thread.sleep(1000);
        System.out.println(t.getState().name());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

WAITING(等待状态)

调用以下方法,使线程处于等待状态:

Object.wait()、Thread.join()、LockSupport.park()
Object.wait():

wait() 是 Java 中 Object 类的一个方法。
它用于线程间通信和同步。
当一个线程调用某个对象的 wait() 方法时,它会释放该对象上的锁,并进入等待状态,直到另一个线程使用相同对象上的 notify() 或 notifyAll() 方法通知它。
wait() 必须在同步的代码块或方法中调用,否则会抛出 IllegalMonitorStateException 异常。
它通常用于生产者-消费者场景或者在线程需要协调它们的操作时使用。
Thread.join():

join() 是 Java 中 Thread 类的一个方法。
它用于等待一个线程完成执行,然后再继续当前线程的执行。
当一个线程调用另一个线程的 join() 方法时,它会阻塞直到另一个线程执行完毕或者指定的超时时间到期。
在主线程需要等待工作线程完成任务后再继续执行时通常会使用 join()。
LockSupport.park():

park() 是 Java 中 LockSupport 类的一个方法。
它提供了比 wait() 和 join() 更低级别的线程同步机制。
它会使当前线程无限期地阻塞,直到被中断或者调用 unpark() 方法并传入当前线程作为参数来解除阻塞。
与 wait() 不同,park() 不需要在任何对象上同步。
它通常用于更高级的同步场景或者处理低级别的并发构造,比如锁或同步器。

 

TIMED_WAITING(具有指定时间的等待状态)

Thread t = new Thread() {
    @Override
    public void run() {
        try {
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};
t.start();

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println(t.getState().name());

 

TERMINATED(已终止线程的线程状态或线程已完成执行)

Thread t = new Thread() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
};
t.start();

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println(t.getState().name());

 

posted @ 2021-09-14 17:52  意犹未尽  阅读(295)  评论(0编辑  收藏  举报