本故事是这样的,咱们有随军和起义军两个军队线程,他们互相打斗厮杀,知道咱们英雄人物程咬金的加入,用他的我的能力来让战争中止,从而让世界回归和平,接下来是咱们的两个线程类。军队线程(BaseArmy)和关键人物线程(KeyRole)和一个舞台线程PlatFormjava
军队线程:BaseArmy.java多线程
在咱们的军队线程中有一个volatile修饰的变量,用来在线程中止的标识,在run()中的yield()方法用来让出cpu资源,从而实现多线程之间的互相交互。ide
package com.war.army; /** * @author swallretu * 建立军队线程 */ public class BaseArmy implements Runnable{ //用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值 private volatile boolean ATTACK = true; @Override public void run() { // TODO Auto-generated method stub showArmy(); } public void showArmy(){ System.out.println(Thread.currentThread().getName()+"发起攻击"); while(ATTACK){ for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName()+"的"+(i+1)+"次攻击"); Thread.yield();//当前现成让出cpu资源 } } System.out.println(Thread.currentThread().getName()+"攻击结束"); } public boolean isATTACK() { return ATTACK; } public void setATTACK(boolean aTTACK) { ATTACK = aTTACK; } }
人物线程:KeyRole.javaui
关键人物线程比较简单,在关键人物加入战斗以后,两个军队线程由于关键人物的加入从而中止战斗,而后世界回归和平线程
package com.war.role; /** * @author swallretu * 建立关键人物角色 */ public class KeyRole implements Runnable{ @Override public void run() { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName()+"出场加入战斗"); for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"的无敌十连击"+(i+1)); } System.out.println(Thread.currentThread().getName()+"结束了攻击"); } }
而后咱们添加咱们故事发展的主线程,即咱们的战斗和英雄人物斗争的舞台线程platform.javacode
舞台线程:PlatForm.javaorm
首先咱们报幕告诉观众战斗要开始了,观众准备观看战斗,而后咱们建立两个军队线程,让他们两个互相战斗同时主线程休眠一会(Thread.sleep(10))让两个军队线程有足够的时间去展现他们,接下来主线程提示观众,英雄人物即将出场而后介绍下英雄人物,而且在此时将两个军队线程战斗指令设置为false,这里使用经过volatile修饰的标识符来通知线程结束任务,这里不推荐使用线程的stop()方法,由于stop()方法会让线程戛然而止,会让程序变得不可控,所以使用volatile修饰的标识符,volatile修饰的变量,线程在每次使用volatile修饰的变量的时候都会读取最后一次修改后的变量值。而后咱们主线程休眠2秒,让两个军队线程有足够的时间去中止他们,从而咱们英雄人物经过join()方法强势夺过主线程cpu的资源,等到咱们英雄人物线程执行完毕,主线程继续通知你们战斗结束世界和平,以上就是咱们这个多线程的小例子资源
package com.war.platform; import com.war.army.BaseArmy; import com.war.role.KeyRole; /** * @author swallretu * 隋唐演义演播线程 */ public class PlatForm extends Thread{ public void run(){ System.out.println("欢迎你们观看隋唐演义新剧"); try { Thread.sleep(5000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println("隋唐演义大戏即将播放,你们一块儿倒数10秒钟开始大戏"); try { Thread.sleep(1000*10); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } BaseArmy suiArmy = new BaseArmy();//建立军队 BaseArmy revoltArmy = new BaseArmy(); Thread sui = new Thread(suiArmy,"隋军");//建立两个军队线程 Thread revolt = new Thread(revoltArmy,"起义军"); sui.start(); revolt.start(); try { Thread.sleep(10);//主线程休眠,休眠期间只有两个army线程抢占cpu资源;休眠结束3个线程共同使用cpu资源 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("这是程咬金加入了战斗,而且将改变战斗局势"); System.out.println("他们的理想是结束战争,创造一个和平的世界"); KeyRole role = new KeyRole();//创造英雄人物 Thread cheng = new Thread(role,"程咬金"); suiArmy.setATTACK(false);//通知线程结束的标记 revoltArmy.setATTACK(false); // sui.stop(); //不要使用stop方法来中止线程,stop方法会让线程戛然而止不能人为的控制程序中止的进度和时间,因此使用volatile修饰的boolean变量来控制线程 // revolt.stop(); try { Thread.sleep(2000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } cheng.start(); try { cheng.join();//调用join方法直接加入执行,其余线程必须等待join方法的线程执行完毕,才可执行他们的线程 } catch (InterruptedException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } System.out.println("隋唐演义播放结束欢迎你们观看,请你们等待5秒钟在陆续离开"); try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("感谢你们配合,请你们按顺序依次离开"); } public static void main(String[] args) { new PlatForm().start(); } }