看到网上关于线程状态转移的博客,好多都没说明白。查了不少资料,汇总一篇,但愿经过这一篇,能把这些状态转移解释明白,若是有什么没考虑到的,但愿指正html
转载注明出处原文地址:http://www.javashuo.com/article/p-qonfhpvx-dk.htmlide
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(); }
死亡态不可逆,一旦线程进入死亡态,就再也回不到其余状态线程