线程状态

it2023-02-03  45

线程状态

New:创建并未启动Runnable:JVM中执行时Blocked:被阻塞等待监视器锁定Waiting:等待其它线程完成指定动作Time Waiting:等待其它线程到达指定时间Terminated:线程已退出执行, 已经终止或中断的线程不能再被启动 // 输出线程状态 public class TestState { public static void main(String[] args) { Thread thread = new Thread(() -> { //设置延迟 for (int i = 0; i < 2; i++) { try { Thread.sleep(1000); System.out.println("/"); } catch (InterruptedException e) { e.printStackTrace(); } } }); // 状态打印 Thread.State state = thread.getState(); System.out.println("未启动时状态:"+state); thread.start(); state = thread.getState(); System.out.println("启动时状态:"+state); // 输出中间循环状态 while (state != Thread.State.TERMINATED){ try { Thread.sleep(100); state = thread.getState(); System.out.println("启动后状态:"+state); } catch (InterruptedException e) { e.printStackTrace(); } } } }

未启动时状态:NEW 启动时状态:RUNNABLE 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING / 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING 启动后状态:TIMED_WAITING / 启动后状态:TERMINATED


sleep

sleep模拟网络延时:放大问题发生性

sleep模拟倒计时

import java.text.SimpleDateFormat; import java.util.Date; // sleep 线程睡眠模拟倒计时 public class TestSleep2 { public static void main(String[] args) { printTime(); } public static void printTime(){ Date startTime = new Date(System.currentTimeMillis()); while (true){ try { Thread.sleep(1000); System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime)); startTime = new Date(System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } } }

19:27:06 19:27:07 19:27:08 19:27:09 19:27:10 19:27:11 19:27:12


yield

线程礼让;让出当前时间片执行权,但是不一定成功;

// 线程礼让 public class TestYield { public static void main(String[] args) { MyYield myYield = new MyYield(); new Thread(myYield,"a").start(); new Thread(myYield,"b").start(); } } class MyYield implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName() + "开始执行。"); Thread.yield();// 礼让 System.out.println(Thread.currentThread().getName() + "结束执行。"); } }

a开始执行。 a结束执行。 b开始执行。 b结束执行。

a开始执行。 b开始执行。 b结束执行。 a结束执行。


join

线程插队:强行让当前线程获取执行权;

// jion 线程抢占 public class TestJoin implements Runnable{ @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("插队执行" + i); } } public static void main(String[] args) { TestJoin testJoin = new TestJoin(); Thread t = new Thread(testJoin); t.start(); for (int i = 0; i < 10; i++) { // 设置插队位置 if (i == 7){ try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("主线程" + i); } } }

主线程0 主线程1 主线程2 主线程3 主线程4 主线程5 主线程6 插队执行0 插队执行1 插队执行2 插队执行3 插队执行4 主线程7 主线程8 主线程9

最新回复(0)