本故事是這樣的,咱們有隨軍和起義軍兩個軍隊線程,他們互相打鬥廝殺,知道咱們英雄人物程咬金的加入,用他的我的能力來讓戰爭中止,從而讓世界迴歸和平,接下來是咱們的兩個線程類。軍隊線程(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(); } }