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();
 }
}
相關文章
相關標籤/搜索