public?class?ArmyRunnable?implements?Runnable?{
//volatile保證了線程可以正確的讀取其他線程寫入的值
//可見性??JMM,happens-before原則??????????????????????????
volatile?boolean?keepRunning;
@Override
public?void?run()?{
while(keepRunning){
//發動五連擊
for(int?i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"攻擊對方【"+i+"】次!");
}
//讓出處理器時間,讓線程們“公平競爭”
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+"戰斗結束了!");
}
}
/**
?*?軍演舞臺
?*/
public?class?Stage?extends?Thread{
@Override
public?void?run()?{
//創建紅藍方攻擊的實例
ArmyRunnable?redAttack0?=?new?ArmyRunnable();
ArmyRunnable?blueAttack0?=?new?ArmyRunnable();
//創建線程
Thread?redAttack?=?new?Thread(redAttack0,"紅方軍團");
Thread?blueAttack?=?new?Thread(blueAttack0,"藍方軍團");
//啟動線程,開始作戰
redAttack.start();
blueAttack.start();
//關閉舞臺線程,保證軍演專心進行
try?{
// this.sleep(50);
Thread.sleep(50);
}?catch?(InterruptedException?e)?{
e.printStackTrace();
}
//關閉線程,鳴金收兵
redAttack0.keepRunning=false;
blueAttack0.keepRunning=false;
//保證藍方運行結束????????????????????????
try?{
blueAttack.join();
}?catch?(InterruptedException?e)?{
e.printStackTrace();
}
}
public?static?void?main(String[]?args)?{
//啟動舞臺,開始觀戰
new?Stage().start();
}
}
2017-07-06