Java线程-隋唐演义大戏
2016-02-20 19:35
453 查看
package SuiTangYanYi; //军队线程 //模拟作战双方的行为 public class ArmyRunnable implements Runnable { //volatile用来修饰被不同线程访问和修改的变量 保证了线程可以正确读取其他线程写入的值 //可见性 ref JMM ,happens-before原则 volatile boolean keepRunning = true; @Override public void run() { while(keepRunning) { //发动5连击 for(int i = 1; i <= 5 ;i++) { System.out.println(Thread.currentThread().getName()+"进攻对方"+i+"次"); //让出处理器时间 各线程重新开始竞争 Thread.yield(); } } System.out.println(Thread.currentThread().getName()+"结束战斗"); } }
package SuiTangYanYi; public class KeyPersonThread extends Thread { public void run() { System.out.println(Thread.currentThread().getName()+"开始战斗"); for(int i = 0; i < 10 ;i++) { System.out.println(Thread.currentThread().getName()+"发起十连击,如入无人之境"); } System.out.println(Thread.currentThread().getName()+"结束战斗"); } }
package SuiTangYanYi; //隋唐演义大戏舞台 public class Stage extends Thread { public void run() { //提示字幕 System.out.println("隋唐演义大戏即将开始"); //休眠两秒 try { Thread.sleep(2000); } catch (InterruptedException e1) { e1.printStackTrace(); } //军队作战任务Runnable接口 ArmyRunnable armyTackOfSuiDynasty = new ArmyRunnable(); ArmyRunnable armyTackOfRevolt = new ArmyRunnable(); //使用Runnable接口创建线程 Thread armyOfSuiDynasty = new Thread(armyTackOfSuiDynasty,"隋军"); Thread armyOfRevolt = new Thread(armyTackOfRevolt,"农民起义军"); //启动线程 军队开始作战 armyOfSuiDynasty.start(); armyOfRevolt.start(); //舞台线程休眠50毫秒 try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("双方激战正酣,却半路杀出个程咬金"); Thread mrCheng = new KeyPersonThread(); mrCheng.setName("程咬金"); //停止线程 军队停止作战 //停止线程的正确做法:退出旗标 like this... armyTackOfSuiDynasty.keepRunning = false; armyTackOfRevolt.keepRunning = false; // armyOfSuiDynasty.stop(); //错误的停止方法stop() 使得线程还未完成就突然停止 // armyOfRevolt.stop(); //另一个错误的停止方法是interrupt()方法 该方法的初衷是中断进程而非停止 当有sleep、join什么的时候 中断会被清空 线程继续运行 //线程休眠 聚焦关键人物 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } mrCheng.start(); //其余线程等待程咬金线程结束 try { mrCheng.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("战争结束!"); //方便展示细节 // armyTackOfSuiDynasty.keepRunning = false; // armyTackOfRevolt.keepRunning = false; // // try { // armyOfRevolt.join(); // } catch (InterruptedException e) { // e.printStackTrace(); // } } public static void main(String[] args) { new Stage().start(); } }
控制台输出效果:
隋唐演义大戏即将开始
隋军进攻对方1次
农民起义军进攻对方1次
隋军进攻对方2次
农民起义军进攻对方2次
隋军进攻对方3次
农民起义军进攻对方3次
隋军进攻对方4次
农民起义军进攻对方4次
隋军进攻对方5次
农民起义军进攻对方5次
隋军进攻对方1次
农民起义军进攻对方1次
隋军进攻对方2次
农民起义军进攻对方2次
隋军进攻对方3次
农民起义军进攻对方3次
隋军进攻对方4次
双方激战正酣,却半路杀出个程咬金
农民起义军进攻对方4次
隋军进攻对方5次
农民起义军进攻对方5次
隋军结束战斗
农民起义军结束战斗
程咬金开始战斗
程咬金发起十连击,如入无人之境
程咬金发起十连击,如入无人之境
程咬金发起十连击,如入无人之境
程咬金发起十连击,如入无人之境
程咬金发起十连击,如入无人之境
程咬金发起十连击,如入无人之境
程咬金发起十连击,如入无人之境
程咬金发起十连击,如入无人之境
程咬金发起十连击,如入无人之境
程咬金发起十连击,如入无人之境
程咬金结束战斗
战争结束!
相关文章推荐
- Java线程相关
- Exception in thread "main" java.lang.NoClassDefFoundError: xxx (wrong name:xxx)
- Atitit.Java exe bat 作为windows系统服务程序运行
- Atitit.Java exe bat 作为windows系统服务程序运行
- Atitit.Java exe bat 作为windows系统服务程序运行
- shiro入门实战笔记(12)--集成Spring
- Java浅拷贝和深拷贝概念以及实现
- java23种设计模式详解
- Spring AOP
- JAVA:Random的种子含义
- mybatis0211 mybatis和spring整合
- ubuntu安装java eclipse
- java(16)--利用session存储购买商品
- spring-aop学习笔记
- java中transient关键字
- JAVA多线程-线程间通信(三)-通过管道进行线程间通信
- How to improve Java's I/O performance( 提升 java i/o 性能)
- eclipse在异常关闭后,导致无法启动workspace问题的解决
- 关于$.ajaxFileUpload()上传图片
- 解决Java接口内部类的main()方法无法打印输出的问题