A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋文轩 黑马帝   /  2011-11-11 17:38  /  2527 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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  整个的线程的执行顺序是怎么回事啊,看了半天有点混乱。

5 个回复

正序浏览
顺序是:主函数开始执行,执行到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方法不结束,那么之后的代码不会执行!!!!

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
你得先明白这段代码是开启了两个线程,一个是main主线程,一个是t对象启动的线程
t.run()这一句只是主线程调用普通函数,这时候还没开启t线程,当主线程调用的run结束后输出一句MyThread running
然后往下执行,t线程开启,调用run方法,执行到sleep(“3000”)的时候t线程等待,同时主线程还在运行,主线程输出Thread Test
然后t线程睡醒了,打印完最后一句MyThread running完事

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
不好意思我说错了3000应该是3秒
回复 使用道具 举报
14行,运行了run();等了3秒打印之后继续。
15行,这个时候运行了t这个进程,现在就有2个进程在运行,一个是主方法中,一个是MyThread。
所以主进程中会运行到16行,而3秒后又打印出了MyThread running  。所有进程才结束。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
因为你的t线程在运行t.start()后自动调用并运行线程里的run方法,但是你的run方法里有Thread.currentThread().sleep(3000);当t线程运行到这一句时会停3000秒后再执行,当t线程不运行时主线程就运行System.out.println("Thread Test");这一句,当主线程运行后等那个t线程停够3000秒了它才继续运行它没运行完的代码所以这段代码最后打印的是MyThread running  
希望能帮到你



评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马