参考文档:https://blog.csdn.net/weixin_45860338/article/details/113824249
B站:遇见狂神说
案例:线程停止
/** * 测试stop * 1.建议线程正常停止-->利用次数,不建议死循环 * 2.建议使用标志位-->设置一个标志位 * 3.不要使用stop或者destroy等过时或者JDK不建议使用的方法 */ public class Demo15_StopThread implements Runnable { // 1. 设置一个标志位 private boolean flag = true; @Override public void run() { int i = 0; while (flag) { System.out.println("run...Thread" + i++); } } // 2. 设置一个公开的方法停止线程,转换标志位 public void stop() { this.flag = false; } public static void main(String[] args) { Demo15_StopThread stop = new Demo15_StopThread(); new Thread(stop).start(); for (int i = 0; i < 1000; i++) { System.out.println("main..." + i); if (i == 900) { //调用stop()切换标志位,让线程终止 stop.stop(); System.out.println("该线程停止了"); } } } }
线程休眠:
/** * 模拟网络延迟:放大问题的发生性 */ public class Demo16_SleepThread implements Runnable { //票数 private int ticketNums = 10; @Override public void run() { while (true) { if (ticketNums <= 0) { break; } //捕获异常 try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "--->拿到了第" + ticketNums-- + "张票"); } } public static void main(String[] args) { Demo4_TrainTicketsCase ticket = new Demo4_TrainTicketsCase(); new Thread(ticket, "小红").start(); new Thread(ticket, "老师").start(); new Thread(ticket, "黄牛1").start(); } }
/** * 模拟倒计时 */ public class Demo17_SleepThread2 { public static void main(String[] args) { try { tenDown(); } catch (InterruptedException e) { e.printStackTrace(); } } //模拟倒计时 public static void tenDown() throws InterruptedException { int num = 10;//10秒 while (true) { Thread.sleep(1000); System.out.println(num--); if (num <= 0) { break; } } } }
/** * 每一秒获取当前时间 */ public class Demo18_SleepThread3 { public static void main(String[] args) { //获取系统当前时间 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(); } } } }
礼让线程:
/** * 测试礼让线程 * 礼让不一定成功,看cpu心情 */ public class Demo19_YieldThread { public static void main(String[] args) { MyYeild myYeild = new MyYeild(); new Thread(myYeild, "a").start(); new Thread(myYeild, "b").start(); } } class MyYeild implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + "线程开始执行"); Thread.yield();//礼让 System.out.println(Thread.currentThread().getName() + "线程停止执行"); } }
线程插队:
/** * 测试join * 插队 */ public class Demo20_JoinThread implements Runnable { @Override public void run() { for (int i = 0; i < 500; i++) { System.out.println("线程vip" + i); } } public static void main(String[] args) throws InterruptedException { //启动我们的线程 Demo20_JoinThread joinThread = new Demo20_JoinThread(); Thread thread = new Thread(joinThread); thread.start(); //主线程 for (int i = 0; i < 500; i++) { if (i == 200) { thread.join();//插队 } System.out.println("main" + i); } } }
观测线程状态:
/** * 观察测试线程状态 */ public class Demo21_ThreadState { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { for (int i = 0; i < 5; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("//"); }); //观察状态 Thread.State state = thread.getState(); System.out.println(state); //观察启动后 thread.start(); state = thread.getState(); System.out.println(state);//Run while (state != Thread.State.TERMINATED) {//只要现成不终止,就一直输出状态 Thread.sleep(100); state = thread.getState();//更新线程状态 System.out.println(state); } //死亡后的线程不能再启动了,启动会报异常 //thread.start(); } }
/** * 线程优先级 */ public class Demo22_ThreadPriority{ public static void main(String[] args) { //主线程默认优先级 System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority()); MyPriority myPriority = new MyPriority(); Thread thread1 = new Thread(myPriority); Thread thread2 = new Thread(myPriority); Thread thread3 = new Thread(myPriority); Thread thread4 = new Thread(myPriority); Thread thread5 = new Thread(myPriority); //先设置优先级,再启动 thread1.start(); thread2.setPriority(1); thread2.start(); thread3.setPriority(4); thread3.start(); thread4.setPriority(Thread.MAX_PRIORITY);//MAX_PRIORITY=10 thread4.start(); thread5.setPriority(8); thread5.start(); } } class MyPriority implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority()); } }
/** * 测试守护线程 * 上帝守护你 */ public class Demo23_DaemonThread { public static void main(String[] args) { God god = new God(); You you = new You(); Thread thread = new Thread(god); //默认false表示是用户线程,正常的线程都是用户线程... thread.setDaemon(true); //上帝守护线程启动 thread.start(); //你 用户线程启动 new Thread(you).start(); } } //上帝 class God implements Runnable{ @Override public void run() { while (true){ System.out.println("上帝保佑着你"); } } } //你 class You implements Runnable{ @Override public void run() { for (int i = 0; i < 36500; i++) { System.out.println("你一生都开心的活着"); } System.out.println("====goodbye!world===="); } }