未启动时状态: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模拟倒计时
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
线程礼让;让出当前时间片执行权,但是不一定成功;
// 线程礼让 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结束执行。
线程插队:强行让当前线程获取执行权;
// 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