您的位置:首页 > 编程语言 > Java开发

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次

隋军结束战斗

农民起义军结束战斗

程咬金开始战斗

程咬金发起十连击,如入无人之境

程咬金发起十连击,如入无人之境

程咬金发起十连击,如入无人之境

程咬金发起十连击,如入无人之境

程咬金发起十连击,如入无人之境

程咬金发起十连击,如入无人之境

程咬金发起十连击,如入无人之境

程咬金发起十连击,如入无人之境

程咬金发起十连击,如入无人之境

程咬金发起十连击,如入无人之境

程咬金结束战斗

战争结束!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: