线程的状态
操作系统里的线程本身是有一个状态的, 但在Java中, Thread类对系统线程进行了封装, 把状态又进一步精细化了.
1. NEW
系统中的线程还没有创建出来, 只是有个 Thread 对象.
例:
public class ThreadDemo1 { public static void main(String[] args) { Thread t = new Thread(() -> { System.out.println("run"); }); System.out.println(t.getState()); //t.start(); } }
2. TERMINATED
系统中的线程已近执行完了, 但 Thread 对象还在.
public class ThreadDemo1 { public static void main(String[] args) throws InterruptedException { Thread t = new Thread(() -> { System.out.println("run"); }); t.start(); t.join(); // 等待线程t执行完后再执行main线程, 保证t线程先结束 System.out.println(t.getState()); } }
3. RUNNABLE
就绪状态, 正在CPU上运行或者 随时可以去CPU上运行.
public class ThreadDemo2 { public static void main(String[] args) { Thread t = new Thread(() -> { while(true) { //循环绝占大部分时间 } }); t.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t.getState()); } }
4. TIMED_WAITING
指定时间等待, 如线程正在sleep.
public class ThreadDemo2 { public static void main(String[] args) { Thread t = new Thread(() -> { while(true) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } }); t.start(); try { Thread.sleep(1000); //睡眠1s为了保证t线程正在睡眠 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t.getState()); } }
5. BLOCKED
表示等待锁时出现的状态.
6. WAITING
使用 wait 方法出现的状态.
总结
当我们创建一个线程对象时(还没有调用start方法), 它是NEW状态, 调用start方法后运行线程就是 RUNNABLE 状态, 当线程结束后, 就是 TERMINATED 状态.
当线程运行时, 如果线程正在 sleep, 则是 TIMED_WAITING 状态.
当线程运行时, 如果线程正在等待锁, 则是 BLOCKED 状态.
当线程运行时, 如果线程使用 wait 方法, 则是 WAITING 状态.