java多线程

本故事是这样的,咱们有随军和起义军两个军队线程,他们互相打斗厮杀,知道咱们英雄人物程咬金的加入,用他的我的能力来让战争中止,从而让世界回归和平,接下来是咱们的两个线程类。军队线程(BaseArmy)和关键人物线程(KeyRole)和一个舞台线程PlatFormjava

  • 军队线程:BaseArmy.java多线程

在咱们的军队线程中有一个volatile修饰的变量,用来在线程中止的标识,在run()中的yield()方法用来让出cpu资源,从而实现多线程之间的互相交互。ide

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.javaui

关键人物线程比较简单,在关键人物加入战斗以后,两个军队线程由于关键人物的加入从而中止战斗,而后世界回归和平线程

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.javacode

  • 舞台线程:PlatForm.javaorm

首先咱们报幕告诉观众战斗要开始了,观众准备观看战斗,而后咱们建立两个军队线程,让他们两个互相战斗同时主线程休眠一会(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();
 }
}
相关文章
相关标签/搜索