本故事是这样的,我们有随军和起义军两个军队线程,他们互相打斗厮杀,知道我们英雄人物程咬金的加入,用他的个人能力来让战争停止,从而让世界回归和平,接下来是我们的两个线程类。军队线程(BaseArmy)和关键人物线程(KeyRole)和一个舞台线程PlatForm
军队线程:BaseArmy.java
在我们的军队线程中有一个volatile修饰的变量,用来在线程停止的标识,在run()中的yield()方法用来让出cpu资源,从而实现多线程之间的互相交互。
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.java
关键人物线程比较简单,在关键人物加入战斗之后,两个军队线程因为关键人物的加入从而停止战斗,然后世界回归和平
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.java
舞台线程:PlatForm.java
首先我们报幕告诉观众战斗要开始了,观众准备观看战斗,然后我们创建两个军队线程,让他们两个互相战斗同时主线程休眠一会(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();
}
}