public class WorldCount {
public static void main(String[] args) {
MyThread m1 = new MyThread(); // 创建了一个新的线程对象,存在heap中
YouThread m2 = new YouThread();
m1.start(); // 创建一个新的线程,并告诉CPU,该线程已经准备完毕,可以调度。
m2.start();// start 是 非 阻塞的,可以继续运行。
// m2.setDaemon(true);// 设置 m2 为守护线程。//或在 将这个设置为 线程对象的一个属性,初始化的时候就自动配置好。// 由此可以看出,守护线程也是子线程的一种,由主线程创建。
// t1.run() 如果直接运行该方法,那么只是主线程的内的一次普通的对象方法调用,没有产生新的线程。主线程会把该方法入栈,运行完毕之后才会出栈;
try {
m1.join(); // 将 子线程的 运行(时间?!?!)加入主线程(的运行时间?)。也就是说,将 主线程阻塞在此,直到子线程运行结束。
} catch (Exception e) {//理论上,子线程还是在他自己的线程内运行的。只是,主线程,在等待着他的结束,然后才继续运行。
}
}
}
class MyThread extends Thread {
// public MyThread(){
// this.setDaemon(true);// 设置 线程对象 默认为守护线程,守护所有的非守护线程。当非守护线程结束之后,它随之结束。
// }
@Override
public void run() { // 当 CPU 调度到该线程时,运行该方法
while (true) {
System.out.println("MyThread");
yield(); // 暂时停止抢占 CPU ,但该命令之后,立刻开始恢复抢占。
}
// try{
// Thread.sleep(5000); //休眠 5 s ,在此时间内,不进行cpu抢占。
// }catch(Exception e){
//
// }
}
}
class YouThread extends Thread {
@Override
public void run() {
while (true) {
System.out.println("YouThread");
yield();
}
}
}