本文共 5776 字,大约阅读时间需要 19 分钟。
看到网上关于线程状态转移的博客,好多都没说明白。查了很多资料,汇总一篇,希望通过这一篇,能把这些状态转移解释明白,如果有什么没考虑到的,希望指正
转载注明出处原文地址:
Thread t1 = new Thread( new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("hello : " + i); } } } ); // t1执行start()之后,处于就绪态,操作系统此时可以分配时间片给该线程,让该线程执行run方法体中的内容 t1.start();
public static void main(String[] args) { // 线程1 Thread t1 = new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println("t1 : running"); } }); t1.start(); // 线程2 Thread t2 = new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println("t2 : running"); } }); t2.start(); }
public static void main(String[] args) { // 线程1 Thread t1 = new Thread(() -> { Thread.yield(); for (int i = 0; i < 10; i++) { System.out.println("t1 : running " + i); } }); t1.start(); // 线程2 Thread t2 = new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println("t2 : running " + i); } }); t2.start(); }
public static void main(String[] args) { Thread t1 = new Thread(() -> { for (int i = 0; i < 10; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("hello : " + i); } } ); // t1执行start()之后,处于就绪态,操作系统此时可以分配时间片给该线程 t1.start(); }
public class TestThread { static Thread t1; static Thread t2; public static void main(String[] args) { // 线程1 t1 = new Thread(() -> { for (int i = 0; i < 100; i++) { if(i == 50) { try { t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("t1 : running " + i); } }); t1.start(); // 线程2 t2 = new Thread(() -> { for (int i = 0; i < 100; i++) { System.out.println("t2 : running " + i); } }); t2.start(); }}
这个很好理解,比如你就执行一个main函数的主线程,等待输入时,该线程是不会结束的,就是处于阻塞状态。
这里牵扯到对象锁的概念
public static void main(String[] args) { // 准备上锁的对象 Object o = new Object(); // 线程1 Thread t1 = new Thread(() -> { synchronized (o) { for (int i = 0; i < 10; i++) { try { if(i == 5) { // 当i=5的时候,让出对象锁,t1进入等待队列 // 如果没人通知,t1一直等待,程序不会结束 o.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("t1 : running " + i); } } }); t1.start(); // 线程2 Thread t2 = new Thread(() -> { synchronized (o) { for (int i = 0; i < 10; i++) { System.out.println("t2 : running " + i); } // 这里t2得到锁,执行完线程方法之后一定要通知t1停止等待。 // 不然t1结束不了,处在一直等待通知的状态 o.notify(); } }); t2.start(); }
死亡态不可逆,一旦线程进入死亡态,就再也回不到其他状态