基于慕课网:深入浅出java多线程
隋唐演义模型:
ArmyRunnable.java代码:
public class ArmyRunnable implements Runnable {
//volatile保证了线程可以正确的读取其他线程写入的值
//可参考:可见性 ref JMM, happens-before原则
volatile boolean keepRunning = true;
@Override
public void run(){
while(keepRunning){
//发动5连击
for (int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"进攻对方["+i+"]");
//让出了处理器时间,下次该谁进攻还不一定呢!(thread.yield()方法------当前运行线程释放处理器资源)
Thread.yield();
}
}
//Thread.currentThread()方法 返回当前运行的线程引用
System.out.println(Thread.currentThread().getName()+"结束了战斗!");
}
}
KeyPersonThread.java代码:
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()+"结束了战斗!");
}
}
这里ArmyRunnable实现了Runnable接口,而KeyPersonThread则继承了Thread类;
这是线程的两种创建方式;
关于实现Runnable接口和继承Thread类区别:
参考自:https://blog.csdn.net/u012767369/article/details/54907191
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
Stage.java代码:
/**
* 隋唐演义大戏舞台
*/
public class Stage extends Thread{
public void run(){
System.out.println("欢迎观看隋唐演义");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("大幕徐徐拉开");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("话说隋朝末年,随军与农民起义军 互相厮杀");
//new两个 ArmyRunnable对象
ArmyRunnable armyTaskOfSuiDynasty = new ArmyRunnable();
ArmyRunnable armyTaskOfRevolt = new ArmyRunnable();
//使用Runnable接口创建线程
Thread armyOfSuiDynasty = new Thread(armyTaskOfSuiDynasty,"隋军");
Thread armyOfRevolt = new Thread(armyTaskOfRevolt,"农民起义军");
//启动线程,两个军队
armyOfSuiDynasty.start();
armyOfRevolt.start();
//舞台线程休眠,大家专心观看军队厮杀
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("正当双方激战,半路杀出个程咬金");
Thread mrCheng = new KeyPersonThread();
mrCheng.setName("程咬金");
System.out.println("程咬金的理想就是结束战争,使百姓安居乐业!");
//停止军队作战
//停止线程方法
armyTaskOfSuiDynasty.keepRunning = false;
armyTaskOfRevolt.keepRunning = false;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mrCheng.start();
//所有线程等待程先生完成历史任务
try {
mrCheng.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("战争结束,人民安居乐业,程先生实现了积极的人生理想,人民安居乐业");
System.out.println("谢谢观看隋唐演义,再见!");
}
public static void main(String[] args){
new Stage().start();
}
}