首页 > 代码库 > java多线程
java多线程
本故事是这样的,我们有随军和起义军两个军队线程,他们互相打斗厮杀,知道我们英雄人物程咬金的加入,用他的个人能力来让战争停止,从而让世界回归和平,接下来是我们的两个线程类。军队线程(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(); } }
java多线程