从你主函数的流程开始说吧。
MyThread t = new MyThread();
这里 是你在堆内存开辟了一片内存空间,你的MyThread类型的变量 t 指向了这片内存空间。
t.run();
t 是 MyThread 类型的,会去内存找它这个类型是否有run方法。有。就去方法区中找到这个run方法。调用run方法的时候,还是主函数在执行,run方法中 有Thread.sleep(3000),sleep是Thread的静态方法,用于线程休眠。这个时候你的主函数中只有主函数线程一个在运行,所以休眠的是主线程。主线程休眠3秒,3秒后,接着执行run方法中的println打印语句。输出b
t.start();
因为MyThread是继承于Thread。这里直接调用继承与Thread的start方法。MyThread被当做线程启动,开始运行它重写的Thread的run方法中的代码。这个时候就有 主线程 和 MyThread线程两个线程在同时跑,抢CPU的执行权
注意 这里有两种情况:
当主线程抢到执行权的时候,和 当MyThread 线程抢到执行权的情况
当主线程抢到执行权,执行主线程的 println语句。打印输出 A。主线程结束,
MyThread线程再抢到执行权,然后休眠3秒,3秒后醒来,输出B
结果BAB
当MyThread线程抢到执行权:执行sleep,休眠3秒,线程在休眠的时候是会放弃执行权的。
MyThread放弃,那么主线程就抢到了,主线程执行,输出A,主线程结束
3秒后MyThread线程醒来,开始执行,输出B
结果BAB
|