黑马程序员技术交流社区
标题:
(已给出个人理解,不足之处请指出)巩固下run()和start方法
[打印本页]
作者:
张立江
时间:
2012-7-3 08:23
标题:
(已给出个人理解,不足之处请指出)巩固下run()和start方法
本帖最后由 张立江 于 2012-7-21 21:34 编辑
class MyThread extends Thread{
public void run(){
try {
Thread./*currentThread().*/sleep(3000);
} catch (InterruptedException e) {
}
System.out.println("MyThread running");
}
}
public class ThreadTest{
public static void main(String argv[]) {
MyThread t = new MyThread();
t.run();
/*
1.调用了run()方法,并未开启线程,所以sleep3000毫秒之后并没有释放线程执行权,3000毫秒之后醒来,
继续执行打印语句.输出MyThread running.之后 该语句执行完毕.
*/
t.start();
/* 2.调用了start()方法,开启线程,于是sleep 3000毫秒,并释放了线程执行权.
*/4.3000毫秒之后,线程醒来,执行打印语句 MyThread running
System.out.println("Thread Test");
/*
3.因为t.run()已经执行完毕,所以是打印语句抢到了执行权,
于是输出Thread Test.之后语该语句执行完毕.
*/
}
}
复制代码
请大家写出分析过程
作者:
王达
时间:
2012-7-3 08:44
本帖最后由 王达 于 2012-7-3 08:46 编辑
在主线程运行到r.run()的时候,是调用MyThread 的run方法,因为currentThread是返回正在执行当前线程对象的引用,而直接用对象调用run方法并未开启线程,所以不会sleep直接运行"MyThread running",到r.start时候会开启一个新的线程,但他会放弃执行资格等待3秒,主线程打印完“Thread Test”后,3秒后新线程才会打印他的"MyThread running"。所以运行结果是:MyThread running Thread Test MyThread running这样顺序的三个。
作者:
刘鹏程
时间:
2012-7-3 09:30
将你的代码加一条输出语句。如下:
public class ThreadTest{
public static void main(String argv[]) {
MyThread t = new MyThread();
System.out.println("try");//为了检验,新增的语句
t.run();
t.start();
System.out.println("Thread Test");
}
}
你再运行看看就知道了,首先输出try,然后由于 t.run();调用了run()的方法,会延时3秒钟再显示MyThread running,注意此时并未开启线程,只是调用了run方法。紧接着瞬间输出了Thread Test。不用解释。再过3秒钟,又会输出MyThread running,这次是开启了线程并start()方法会自动调用run()方法。所以改后的程序输出如下:
try
MyThread running//(在上行输出后3秒),未开启线程
Thread Test//(紧接着上行输出)
MyThread running//(在上行输出后3秒),已开启线程
最后总结:
run()只是调用函数,不开启线程。
start()开启线程,并调用函数run()。
作者:
Forever。
时间:
2012-7-3 09:31
第一步 执行到 t.run();的时候调用run方法,在run方法主线程休息三秒钟后执行 System.out.println("MyThread running");
第二步 开启线程t 这时候有两个线程在运行, t运行run方法时休息三秒 所以通常主线程中的System.out.println("Thread Test");会先执行。
第三步 t线程开启三秒后执行t线程中的 System.out.println("MyThread running");
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2