我的一些见解
public class Stage extends Thread {
public void run(){
ArmyRunnable armyTaskOfSuiDynasty = new ArmyRunnable();
ArmyRunnable aryTaskOfRevolt = new ArmyRunnable();
//使用Runnable对象接口创建线程
Thread armyOfSuiDynasty = new Thread(armyTaskOfSuiDynasty,"隋军");
Thread aryOfRevolt = new Thread(aryTaskOfRevolt,"起义军");
//启动
armyOfSuiDynasty.start();
aryOfRevolt.start();
System.out.println("帷幕拉开,表演开始");
//舞台线程休眠
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
armyTaskOfSuiDynasty.keepRunning = false;
aryTaskOfRevolt.keepRunning = false;
try {
//主线程等待2个线程结束
armyOfSuiDynasty.join();
aryOfRevolt.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("关闭舞台");
}
public static void main(String[] args) {
Stage stage = new Stage();
stage.setName("舞台");
stage.start();
}
}一开始看完后有点懵。仔细想了想,运行了几次,一点小理解。
首先,main方法启动了舞台线程,执行run方法。
顺着顺序执行到舞台线程休眠(50毫秒),这个时候给了隋军和起义军这两个线程使用处理器资源的时间(前期虽然有2个线程都已经开始,但他们没有处理器使用权),所以这两个线程中的一个会首先执行,因为for循环中有yield,所以处理器在50毫秒之内被2个线程随机使用,50毫秒以后,舞台线程也加入处理器的争取中,一旦争取到了 就会往下执行,keepRunning设置为false,然后两个线程执行join方法。当两个线程都停止后,舞台线程继续执行直到结束。