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());