Thread 线程状态--1.1.2
一、 线程状态定义
线程状态定义在 java.lang.Thread.State 这个枚举中,一共定义了6总线程状态:
1. New: 尚未启动的线程状态
2. Runnable: 可运行线程的状态,等待CPU调度。(处于这个状态的线程线程不一定正在执行,也有可能是在等待cpu调度)
3. Blocked: 线程阻塞等待监视器锁定的线程状态。 处于synchronized 同步代码块或方法中被阻塞。
4. Waiting: 等待线程的线程状态。 这些为不带超时的方式: Object.wait、Thread.join、LockSupport.park。
5.Timed Waiting: 具有指定等待时间的等待线程的线程状态。这些为带超时的方式:Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUnitl
6.Terminated: 终止线程的线程状态。线程正常执行完成或者出现异常。
二、线程状态之间的切换

下面进行代码演示状态的变更:
1. 线程从 新建-> 可运行--> 终止
1 public class ThreadStateTest { 2 3 public static void main(String[] args) throws InterruptedException { 4 ThreadStateTest.threadState1(); 5 } 6 7 public static void threadState1() throws InterruptedException { 8 // 第一种: 线程从 新建---> 运行 ---> 终止 9 System.out.println("**********第一种线程状态切换: 新建---> 运行 ---> 终止***************"); 10 Thread thread1 = new Thread(new Runnable() { 11 public void run() { 12 System.out.println("thread1当前状态为:" + Thread.currentThread().getState().toString()); 13 System.out.println("thread1执行了"); 14 } 15 }); 16 // 没有调用start方法时,打印线程状态、 17 System.out.println("没有调用start方法时,thread1的状态为:" + thread1.getState().toString()); 18 thread1.start(); 19 // 等待2L thread1 执行完毕后打印线程状态 20 Thread.sleep(2000L); 21 System.out.println("thread1执行完毕后线程状态为:" + thread1.getState().toString()); 22 } 23 24 }
运行结果:

2. 线程从新建---> 可运行---> 等待--> 可运行---> 终止
1 public class ThreadStateTest { 2 3 public static ThreadStateTest demo = new ThreadStateTest(); 4 5 public static void main(String[] args) throws InterruptedException { 6 ThreadStateTest.threadState2(); 7 } 8 9 public static void threadState2() throws InterruptedException { 10 // 第二种: 线程从 新建---> 可运行----> 等待---> 可运行---> 终止 11 System.out.println("**第二种线程状态切换: 线程从 新建---> 可运行---> 等待--> 可运行--> 终止***"); 12 Thread thread2 = new Thread(new Runnable() { 13 public void run() { 14 synchronized (demo) { 15 try { 16 demo.wait(); 17 } catch (InterruptedException e) { 18 e.printStackTrace(); 19 } 20 } 21 try { 22 Thread.sleep(1000); 23 } catch (InterruptedException e) { 24 e.printStackTrace(); 25 } 26 System.out.println("thread2当前状态为:" + Thread.currentThread().getState().toString()); 27 System.out.println("thread2执行了"); 28 } 29 }); 30 // 没有调用start方法时,打印线程状态、 31 System.out.println("没有调用start方法时,thread2的状态为:" + thread2.getState().toString()); 32 thread2.start(); 33 System.out.println("thread2线程状态为:" + thread2.getState().toString()); 34 Thread.sleep(500L); 35 System.out.println("thread2线程状态为:" + thread2.getState().toString()); 36 synchronized (demo) { 37 demo.notifyAll(); 38 } 39 // 等待2L thread2执行完毕后打印线程状态 40 Thread.sleep(2000L); 41 System.out.println("thread2线程状态为:" + thread2.getState().toString()); 42 } 43 }
运行结果:

关于以下代码的疑问:
1 synchronized (demo) { 2 try { 3 demo.wait(); 4 } catch (InterruptedException e) { 5 e.printStackTrace(); 6 } 7 } 8 9 synchronized (demo) { 10 demo.notifyAll(); 11 }
请参靠wait方法和notifyAll方法的javaDoc或者参考博客:https://blog.csdn.net/historyasamirror/article/details/6709693
3.线程从新建---> 可运行---> 带超时时间等待--> 可运行---> 终止
1 public class ThreadStateTest { 2 3 public static ThreadStateTest demo = new ThreadStateTest(); 4 5 public static void main(String[] args) throws InterruptedException { 6 ThreadStateTest.threadState3(); 7 } 8 9 public static void threadState3() throws InterruptedException{ 10 //第三种: 线程从 新建---> 可运行----> 带超时时间等待---> 可运行---> 终止 11 System.out.println("**第三种线程状态切换: 线程从 新建---> 可运行---> 带超时时间等待 --> 可运行--> 终止***"); 12 Thread thread3 = new Thread(new Runnable() { 13 @Override 14 public void run() { 15 try { 16 synchronized (demo){ 17 demo.wait(1000); 18 } 19 }catch (InterruptedException e){ 20 e.printStackTrace(); 21 } 22 System.out.println("thread3当前状态为:" + Thread.currentThread().getState().toString()); 23 System.out.println("thread3执行了"); 24 } 25 }); 26 // 没有调用start方法时,打印线程状态、 27 System.out.println("没有调用start方法时,thread3的状态为:" + thread3.getState().toString()); 28 thread3.start(); 29 System.out.println("thread2线程状态为:" + thread3.getState().toString()); 30 Thread.sleep(500L); 31 System.out.println("thread2线程状态为:" + thread3.getState().toString()); 32 synchronized (demo) { 33 demo.notifyAll(); 34 } 35 // 等待2L thread2执行完毕后打印线程状态 36 Thread.sleep(2000L); 37 System.out.println("thread3线程状态为:" + thread3.getState().toString()); 38 } 39 }
运行结果:
**第三种线程状态切换: 线程从 新建---> 可运行---> 带超时时间等待 --> 可运行--> 终止***
没有调用start方法时,thread2的状态为:NEW
thread2线程状态为:RUNNABLE
thread2线程状态为:TIMED_WAITING
thread2当前状态为:RUNNABLE
thread2执行了
thread2线程状态为:TERMINATED
4.线程从新建---> 可运行---> 阻塞 --> 可运行---> 终止
示例代码:
1 public class ThreadStateTest { 2 3 public static ThreadStateTest demo = new ThreadStateTest(); 4 5 public static void main(String[] args) throws InterruptedException { 6 ThreadStateTest.threadState4(); 7 } 8 9 public static void threadState4() throws InterruptedException{ 10 //第四种: 线程从 新建---> 可运行----> 带超时时间等待---> 可运行---> 终止 11 System.out.println("**第四种线程状态切换: 线程从 新建---> 可运行---> 阻塞 --> 可运行--> 终止***"); 12 Thread thread4 = new Thread(new Runnable() { 13 @Override 14 public void run() { 15 synchronized (demo){ 16 System.out.println("thread4当前状态为:" + Thread.currentThread().getState().toString()); 17 System.out.println("thread4执行了"); 18 } 19 } 20 }); 21 // 没有调用start方法时,打印线程状态、 22 synchronized (demo){ 23 System.out.println("没有调用start方法时,thread4的状态为:" + thread4.getState().toString()); 24 thread4.start(); 25 System.out.println("thread4线程状态为:" + thread4.getState().toString()); 26 //等待2秒,再看thread4的状态 27 Thread.sleep(2000L); 28 System.out.println("thread4线程状态为:" + thread4.getState().toString()); 29 } 30 // 等待2S thread4执行完毕后打印线程状态 31 Thread.sleep(2000L); 32 System.out.println("thread4线程状态为:" + thread4.getState().toString()); 33 } 34 }
运行结果:
**第四种线程状态切换: 线程从 新建---> 可运行---> 阻塞 --> 可运行--> 终止***
没有调用start方法时,thread4的状态为:NEW
thread4线程状态为:RUNNABLE
thread4线程状态为:BLOCKED
thread4当前状态为:RUNNABLE
thread4执行了
thread4线程状态为:TERMINATED
以上就是线程状态的切换的演示内容!

浙公网安备 33010602011771号