package thread;
public class ArmyRunnable implements Runnable {
//volatile保證了線程可以正确的讀取其他線程寫入的值
//保證可見性,ref JMM,happens-before原則
//修飾被不同線程通路和修改的變量
volatile boolean keepRunning = true;
@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("結束!");
}
}
package thread;
public class KeyPersonThread extends Thread {
public void run(){
System.out.println(Thread.currentThread().getName()+"開始了!");
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName());
}
System.out.println(Thread.currentThread().getName()+"結束了!");
}
}
package thread;
/**
* 隋唐演義大戲舞台
*/
public class Stage extends Thread {
public void run() {
ArmyRunnable armyTaskOfSuiDynasty = new ArmyRunnable();
ArmyRunnable armyTaskOfRevolt = new ArmyRunnable();
// 使用Runnable接口建立線程
Thread armyOfSuiDynasty = new Thread(armyTaskOfSuiDynasty, "小明");
Thread armyOfRevolt = new Thread(armyTaskOfRevolt, "小紅");
// 啟動線程,讓軍隊開始作戰
armyOfSuiDynasty.start();
armyOfRevolt.start();
// 線程休眠
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
armyOfRevolt.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("來了");
Thread mrCheng = new KeyPersonThread();
mrCheng.setName("小黑");
System.out.println("xxx");
//停止線程的方法
armyTaskOfSuiDynasty.keepRunning = false;
armyTaskOfRevolt.keepRunning = false;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mrCheng.start();
try {
mrCheng.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("結束");
}
public static void main(String[] args) {
new Stage().start();
}
}