首页 > 代码库 > 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多线程