黑马程序员技术交流社区

标题: 关于Thread中的run和start [打印本页]

作者: 王瀛    时间: 2013-1-8 10:46
标题: 关于Thread中的run和start
刚开始接触线程,练习的时候将代码A中的start()改成run(),结果不一样了。
附代码:
代码A
  1. class Test extends Thread
  2. {
  3.         private String name;
  4.         Test(String name)
  5.         {
  6.                 this.name = name;
  7.         }
  8.         public void run()
  9.         {
  10.                 for (int x = 0;x<600 ;x++ )
  11.                 {
  12.                         System.out.println(name+"run..."+x);
  13.                 }
  14.         }
  15. }
  16. class ThreadTest
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 Test t1 = new Test("我是一号线程");
  21.                 Test t2 = new Test("二号线程是我");
  22.                 t1.start();
  23.                 t2.start();

  24.                 for (int x =0;x<600 ;x++ )
  25.                 {
  26.                         System.out.println("main....."+x);
  27.                 }
  28.         }
  29. }
复制代码
代码B
  1. class Test extends Thread
  2. {
  3.         private String name;
  4.         Test(String name)
  5.         {
  6.                 this.name = name;
  7.         }
  8.         public void run()
  9.         {
  10.                 for (int x = 0;x<600 ;x++ )
  11.                 {
  12.                         System.out.println(name+"run..."+x);
  13.                 }
  14.         }
  15. }
  16. class ThreadTest
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 Test t1 = new Test("我是一号线程");
  21.                 Test t2 = new Test("二号线程是我");
  22.                 t1.run();
  23.                 t2.run();

  24.                 for (int x =0;x<600 ;x++ )
  25.                 {
  26.                         System.out.println("main....."+x);
  27.                 }
  28.         }
  29. }
复制代码
代码A的结果是三个线程相互穿插打印的
代码B是一个线程打印完再打印下一个


API中对start()方法的描述是:
使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

为什么结果会不一样呢?



作者: 王少雷    时间: 2013-1-8 12:26
代码A 开启线程 走的是 线程流程,主函数 线程执行权比较强,执行完 再执行别的线程,线程有一种随机执行权的问题。
代码B  又没走线程流程,只是 普通一个线程,普通的调用 方法而已,按顺序执行呗。
作者: 何竹冬    时间: 2013-1-8 12:49
你好
开启线程使用start方法,run方法只是一个方法调用。
当开启多个线程的时候他们会和主线程抢夺cpu执行权,所以会出现交替执行的情况。
而调用run方法只是一个方法调用都在主线程内执行所以会按顺序执行。
作者: 炉海佳    时间: 2013-2-14 23:56
举例说明run()意思是你在写代码,然后叫你去扫地,你去扫地回来继续写代码,扫地写代码都是你一个人干的。而start()是你在写代码叫另一个人去扫地,你们两人同时进行,你们两就是两线程,效率肯定快
作者: 邵俊达    时间: 2013-3-3 05:34
start().会开启一一个线程,并调用run(). 如果直接写run()的话没有开启线程,所以程序中就只有主线程,所以就顺序执行了。
作者: 1844611785    时间: 2013-5-4 23:34
其实在B中只有一个线程在使用CPU资源(main线程),你只是创建了两个线程,并没有启动。所以主线程是按照先后顺序执行的。




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