从你主函数的流程开始说吧。 
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 
 |