黑马程序员技术交流社区
标题:
运行结果疑问
[打印本页]
作者:
实战造就实力
时间:
2014-1-4 18:52
标题:
运行结果疑问
本帖最后由 实战造就实力 于 2014-1-4 19:27 编辑
分析以下程序运行结果,说明原理。
public static void main(String[] args) {
MyThread t = new MyThread();
t.run();
t.start();
System.out.println("A");
}
class MyThread extends Thread {
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
System.out.println("B");
}
}
请大师家解释一下这道题谢谢了
作者:
高亮亮
时间:
2014-1-4 19:12
你是不是将MyThread类的定义放到测试类中了.这样就成了成员内部类了.是不能你那样创建的.
要这样:
MyThread t = new Test().new MyThread();
作者:
圜谎
时间:
2014-1-4 19:33
汗,主函数没放到类里面去呢,加个类就能编译通过了
class Demo
{
public static void main(String[] args) {
MyThread t = new MyThread();
t.run();
t.start();
System.out.println("A");
}
}
class MyThread extends Thread {
public void run() {
try {
Thread.sleep(3000);
}
catch (InterruptedException e) {
}
System.out.println("B");
}
}
复制代码
作者:
其LovE斤
时间:
2014-1-4 19:43
从你主函数的流程开始说吧。
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
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2