多线程

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();
        }
    }
}
原文地址:https://www.cnblogs.com/jijizhazha/p/7735219.html