黑马程序员技术交流社区

标题: 关于多线程 [打印本页]

作者: 贾存双    时间: 2012-7-12 18:32
标题: 关于多线程
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() ;
}
} ;
=========================================================

作者: 丁二跃    时间: 2012-7-12 18:48
thr1.run() ;   //为什么运行到这里的时候先是main运行???
thr2.run() ;

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

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

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

           
作者: 陈淑飞    时间: 2012-7-12 18:51
  thr1.run() ;   //为什么运行到这里的时候先是main运行???
  thr2.run() ;
  System.out.println("======================") ;
  thr1.start() ; //运行到这里才是线程A、B的运行
  thr2.start() ;

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

只有在thr1.start() ; 时,jvm 才是调用底层代码,开户另一线程呢。
作者: 李思静    时间: 2012-7-13 06:18
因为main函数是程序的入口,不管是什么程序,运行的时候肯定是首先main函数开始执行,执行的时候到了thr1.start()和thr2.start()时启动thr1和thr2这两个线程,线程都启动了之后,就会按照线程的优先级对时间片进行划分,然后运行,至于打印的结果,每次执行运行的结果都应该是不同的。
作者: 柯玲    时间: 2012-7-13 09:01
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

作者: 柯玲    时间: 2012-7-13 09:04
Thread类的start()方法就相当于java程序的入口main()方法,没有main(),java程序就无法运行,同样地,不调用线程的start()就相当于没有开启线程




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