黑马程序员技术交流社区

标题: 线程执行顺序问题 [打印本页]

作者: 宋文轩    时间: 2011-11-11 17:38
标题: 线程执行顺序问题
  1. class MyThread extends Thread{
  2.         public void run(){
  3.                 try {
  4.                         Thread.currentThread().sleep(3000);
  5.                 } catch (InterruptedException e) {
  6.                 }
  7.                 System.out.println("MyThread running");
  8.         }
  9. }

  10. public class ThreadTest{
  11.         public static void main(String argv[]) {
  12.                 MyThread t = new MyThread();
  13.                 t.run();
  14.                 t.start();
  15.                 System.out.println("Thread Test");
  16.           }
  17. }
复制代码
这段代码最后为什么是打印MyThread running  整个的线程的执行顺序是怎么回事啊,看了半天有点混乱。
作者: 柴永菲    时间: 2011-11-11 18:14
因为你的t线程在运行t.start()后自动调用并运行线程里的run方法,但是你的run方法里有Thread.currentThread().sleep(3000);当t线程运行到这一句时会停3000秒后再执行,当t线程不运行时主线程就运行System.out.println("Thread Test");这一句,当主线程运行后等那个t线程停够3000秒了它才继续运行它没运行完的代码所以这段代码最后打印的是MyThread running  
希望能帮到你




作者: 齐国峰    时间: 2011-11-11 18:17
14行,运行了run();等了3秒打印之后继续。
15行,这个时候运行了t这个进程,现在就有2个进程在运行,一个是主方法中,一个是MyThread。
所以主进程中会运行到16行,而3秒后又打印出了MyThread running  。所有进程才结束。
作者: 柴永菲    时间: 2011-11-11 18:41
不好意思我说错了3000应该是3秒
作者: olkldksl    时间: 2011-11-11 19:08
你得先明白这段代码是开启了两个线程,一个是main主线程,一个是t对象启动的线程
t.run()这一句只是主线程调用普通函数,这时候还没开启t线程,当主线程调用的run结束后输出一句MyThread running
然后往下执行,t线程开启,调用run方法,执行到sleep(“3000”)的时候t线程等待,同时主线程还在运行,主线程输出Thread Test
然后t线程睡醒了,打印完最后一句MyThread running完事

作者: 张志东    时间: 2011-11-11 19:41
顺序是:主函数开始执行,执行到t.run()的时候调用run()方法,注意这是一个方法而非线程,也就是说这个方法不执行完毕,那么方法之后的代码是不会被执行到的,所以直到3秒之后打印出第一行“MyThread running”时也就是t直接调用(而不是通过start方法启动线程调用的run方法)的run()方法结束(注意是方法结束),主线程才继续往下执行,很明显,t.start()启动了一个新线程,并直接进入睡眠状态,但是主函数并接着继续往下执行主函数中的 System.out.println("Thread Test");语句,也就是打印了第二句:Thread Test ,主线程结束。而此时t.start()线程还在睡眠状态中,直到该线程结束!
可能使你迷惑的地方就是你以为通过t直接调用run方法也是一个线程。重点理解:t直接调用的run方法不结束,那么之后的代码不会执行!!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2