实现隋朝农民起义的过程:线程的yield与方法random判别的区别
package fengke.game.thread;
import java.util.PriorityQueue;
import javax.swing.plaf.SliderUI;
/**
* 使用线程的yield()方式实现隋朝农民起义
* @author 锋客
*内容:1、创建军队线程===ruannable
* 2、创建类,存放军队信息
* 3、演义军队战争
* 4.演出创建
*
*/
public class Stage {
public static void main(String[] args) {
//创建军队========》线程
ArmyRunnable armyRunnable_Sui = new ArmyRunnable();
ArmyRunnable armyRunnable_Revolt = new ArmyRunnable();
Thread thread_armyRunnable_Sui=new Thread(armyRunnable_Sui,"隋朝军队");
Thread thread_armyRunnable_Revolt=new Thread(armyRunnable_Revolt,"起义军");
//定义各个军队人数和军队名
int number_armyRunnable_Sui=100;//隋朝军队人数
int number_armyRunnable_Revolt=80;//起义军人数
//将军队信息存放入类中信息
Information infor=new Information();
infor.number_army=number_armyRunnable_Sui;
infor.number_revolt=number_armyRunnable_Revolt;
armyRunnable_Sui.infor=infor;
armyRunnable_Revolt.infor=infor;
/*
* 开始作战
* 使用start()与run()有区别
* 前者进程交替使用,后者先执行完当前的run()犯法,再执行下一个代码;
*/
System.out.println("演出即将开始:请大家带好眼镜,做好准备!!!!");
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//战争模拟
thread_armyRunnable_Sui.start();
thread_armyRunnable_Revolt.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("欢迎大家下次再来!!!");
}
}
package fengke.game.thread;
/**
* 军队线程
*
* @author 锋客 内容:1.实现军队线程的创建 2.模拟战争情况
*/
public class ArmyRunnable implements Runnable {
Information infor;
@Override
public void run() {
// 下列定义的变量在各个情况下,只调用一次,不会改变值
// int number_armykilled = 0;
// int number_revoltkilled = 0;
// int number_army = infor.number_army;
// int number_revolt = infor.number_revolt;
int number_army = infor.number_army;
int number_revolt = infor.number_revolt;
switch (Thread.currentThread().getName()) {
case "隋朝军队":
while (true) {
// infor.number_revolt <= 0 || infor.number_army <= 0判断单方人数是否为0
if (infor.number_revolt <= 0 || infor.number_army <= 0) {
if (infor.number_revolt <= 0) {
System.out.println("隋朝军队胜利!!!");
System.out.println("误伤平民"+(0-infor.number_revolt)+"人");
} else {
System.out.println("起义军胜利!!!");
System.out.println("误伤平民"+(0-infor.number_army)+"人");
}
break;
}
int number_temp1 = 0;
// 模拟军队的战争情况
number_temp1 = (int) (Math.random() * 10);
System.out.println(Thread.currentThread().getName() + "发起了强烈的进攻," + "以" + (infor.number_army) + "兵力"
+ "重伤敌军" + number_temp1 + "人!!!");
// 可以实现累加功能,累计被杀敌军数
infor.number_revolt = infor.number_revolt - number_temp1;
Thread.yield();
}
break;
case "起义军":
while (true) {
//记录本次杀敌人数
int number_temp = 0;
if (infor.number_revolt <= 0 || infor.number_army <= 0) {
break;
}
number_temp = (int) (Math.random() * 10);
System.out.println(Thread.currentThread().getName() + "发起了强烈的进攻," + "以" + (infor.number_revolt) + "兵力"
+ "重伤敌军" + number_temp + "人!!!");
infor.number_army = infor.number_army - number_temp;
Thread.yield();
}
break;
default:
System.out.println("演出结束!!!");
break;
}
}
}
=============================================================================================
package fengke.game.random;
import java.util.PriorityQueue;
import java.util.Random;
import javax.swing.plaf.SliderUI;
/**
* 通过随机数的方法实现隋唐演义(不使用yield)
*
* @author 锋客
* 内容:1、创建军队线程===ruannable
* 2、创建类,存放军队信息
* 3、演义军队战争
* 4、演出创建
* 异常:线程的创建使用extends Thread的方法时出现异常
* java.lang.IllegalThreadStateException===同一个Thread不能重复调用start方法
*
*/
public class Stage {
public static void main(String[] args) {
// 创建军队========》线程
ArmyRunnable armyRunnable_Sui = new ArmyRunnable();
ArmyRunnable armyRunnable_Revolt = new ArmyRunnable();
/*
* 该创建的线程有问题,在下面代码中会有提到
* Thread thread_armyRunnable_Sui = new Thread(armyRunnable_Sui, "隋朝军队");
* Thread thread_armyRunnable_Revolt = new Thread(armyRunnable_Revolt, "起义军");
*/
// 定义各个军队人数和军队名
int number_armyRunnable_Sui = 100;// 隋朝军队人数
int number_armyRunnable_Revolt = 80;// 起义军人数
// 将军队信息存放入类中信息
Information infor = new Information();//专门存放军队信息
infor.number_army = number_armyRunnable_Sui;
infor.number_revolt = number_armyRunnable_Revolt;
armyRunnable_Sui.infor=infor;
armyRunnable_Revolt.infor=infor;
//开始演出
System.out.println("演出即将开始:请大家带好眼镜,做好准备!!!!");
System.out.println();
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
/*
* 战争模拟 内容:
* 使用Random类 产生随机数,確定軍隊紛爭
* 战争结束的条件:单方军队数为0
*/
Random random = new Random();
while(infor.number_revolt > 0 && infor.number_army > 0){
if(random.nextInt(2)>0){
Thread thread_armyRunnable_Sui = new Thread(armyRunnable_Sui, "隋朝军队");
thread_armyRunnable_Sui.start();
}else{
Thread thread_armyRunnable_Revolt = new Thread(armyRunnable_Revolt, "起义军");
thread_armyRunnable_Revolt.start();
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 不使用下列代码的原因:
* 对于一个线程来说,他只能被启动一次,不能重复启动;
*
* while(infor.number_revolt > 0 && infor.number_army > 0){
* if (random.nextInt(2) > 0) {
* thread_armyRunnable_Sui.start();
* } else {
* thread_armyRunnable_Revolt.start();
* }
* }
*/
System.out.println();
System.out.println("欢迎大家下次再来!!!");
}
}
package fengke.game.thread;
public class Information {
public int number_army=0;
public int number_revolt=0;
}
package fengke.game.random;
import java.util.Random;
/**
* 军队线程
* @author 锋客
* 内容:
* 1.实现军队线程的创建
* 2.模拟战争情况
*/
public class ArmyRunnable implements Runnable {
//存放军队信息
Information infor;
@Override
public void run() {
// 下列定义的变量在各个情况下,只调用一次,不会改变值
// int number_armykilled = 0;
// int number_revoltkilled = 0;
// int number_army = infor.number_army;
// int number_revolt = infor.number_revolt;
int number_army = infor.number_army;
int number_revolt = infor.number_revolt;
switch (Thread.currentThread().getName()) {
case "隋朝军队":
int number_temp1 = 0;
// 模拟军队的战争情况
//number_temp1为起义军死亡人数,random类产生0----(infor.number_revolt+1)的数,防止双方最后剩一个人,造成死循环
number_temp1 = new Random().nextInt(infor.number_revolt+1);
System.out.println(Thread.currentThread().getName() + "发起了强烈的进攻," + "以" + (infor.number_army) + "兵力"
+ "重伤敌军" + number_temp1 + "人!!!");
// 可以实现累加功能,累计被杀敌军数
infor.number_revolt = infor.number_revolt - number_temp1;
// infor.number_revolt <= 0 || infor.number_army <= 0判断单方人数是否为0
if (infor.number_revolt <= 0 || infor.number_army <= 0) {
if (infor.number_revolt <= 0) {
System.out.println("隋朝军队胜利!!!");
System.out.println("误伤平民"+(0-infor.number_revolt)+"人");
} else {
System.out.println("起义军胜利!!!");
System.out.println("误伤平民"+(0-infor.number_army)+"人");
}
}
break;
case "起义军":
//记录本次杀敌人数
int number_temp = 0;
//number_temp1为隋朝军队死亡人数,random类产生0----(infor.number_army+1)的数,防止双方最后剩一个人,造成死循环
Random random=new Random();
number_temp = random.nextInt(infor.number_army+1);
System.out.println(Thread.currentThread().getName() + "发起了强烈的进攻," + "以" + (infor.number_revolt) + "兵力"
+ "重伤敌军" + number_temp + "人!!!");
infor.number_army = infor.number_army - number_temp;
if (infor.number_revolt <= 0 || infor.number_army <= 0) {
if (infor.number_revolt <= 0) {
System.out.println("隋朝军队胜利!!!");
System.out.println("误伤平民"+(0-infor.number_revolt)+"人");
} else {
System.out.println("起义军胜利!!!");
System.out.println("误伤平民"+(0-infor.number_army)+"人");
}
}
break;
default:
break;
}
}
}
package fengke.game.random;
/**
* 存放基本军队信息
* @author 锋客
*
*/
public class Information {
public int number_army=0;
public int number_revolt=0;
}
=============================================================================================