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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾存双 中级黑马   /  2012-7-12 18:32  /  1792 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class MyThread extends Thread{
public MyThread(String name){
  super(name) ;
}
public void run(){
  for(int i=0;i<10;i++){
   System.out.println(Thread.currentThread().getName() + "运行,i=" +i ) ;
  }
}
} ;
public class ThreadDemo{
public static void main(String args[]){
  MyThread thr1 = new MyThread("线程A") ;
  MyThread thr2 = new MyThread("线程B") ;
  thr1.run() ;   //为什么运行到这里的时候先是main运行???
  thr2.run() ;
  System.out.println("======================") ;
  thr1.start() ; //运行到这里才是线程A、B的运行
  thr2.start() ;
}
} ;
=========================================================

5 个回复

倒序浏览
thr1.run() ;   //为什么运行到这里的时候先是main运行???
thr2.run() ;

注意啊:启动一个线程后虽然运行的是定义线程内的run 方法,但是启动线程不是靠的调用run
           启动一个线程应该使用start()方法,该方法会进行一些操作启动线程并调用run 方法。

你的  thr1.run() ;
         thr2.run() ;
实际上是在主函数内调用了 类实例内的run 方法,执行程序的仍是 main线程

thr1.start()
thr2.start()
才是真正的启动了两个线程

           
回复 使用道具 举报
  thr1.run() ;   //为什么运行到这里的时候先是main运行???
  thr2.run() ;
  System.out.println("======================") ;
  thr1.start() ; //运行到这里才是线程A、B的运行
  thr2.start() ;

因为 一开始main函数入口执行第一句时,都只有一个线程那就是main,在执行
thr1.run() ;  时,依然是 main线程。 只有start()方法,才能开启另一线程。

只有在thr1.start() ; 时,jvm 才是调用底层代码,开户另一线程呢。
回复 使用道具 举报
因为main函数是程序的入口,不管是什么程序,运行的时候肯定是首先main函数开始执行,执行的时候到了thr1.start()和thr2.start()时启动thr1和thr2这两个线程,线程都启动了之后,就会按照线程的优先级对时间片进行划分,然后运行,至于打印的结果,每次执行运行的结果都应该是不同的。
回复 使用道具 举报
MyThread thr1 = new MyThread("线程A") ;
MyThread thr2 = new MyThread("线程B") ;
---此处创-建Thread类的子类对象就相当于创建一个新线程

thr1.run() ;   //为什么运行到这里的时候先是main运行???
thr2.run() ;
解释:main是主线程,原因:java虚拟机启动的时候有一个进程java.exe,该进程至少有一个线程负责java程序的运行,而这个线程运行的代码存在于main中,它就是主线程;
Thread子类对象.run();仅仅是对象调用方法,新创建的线程并没有运行,所以会在主线程main中按顺序执行


thr1.start() ; //运行到这里才是线程A、B的运行
thr2.start() ;
这里的start()才把刚才新创建的两个线程thr1、thr2开启,并分别执行两个线程的run()

QQ截图20120713090007.jpg (18.95 KB, 下载次数: 17)

QQ截图20120713090007.jpg

QQ截图20120713085939.jpg (10.41 KB, 下载次数: 22)

QQ截图20120713085939.jpg

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Thread类的start()方法就相当于java程序的入口main()方法,没有main(),java程序就无法运行,同样地,不调用线程的start()就相当于没有开启线程
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马