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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王瀛 高级黑马   /  2013-1-8 10:46  /  2401 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

刚开始接触线程,练习的时候将代码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 方法。

为什么结果会不一样呢?


6 个回复

倒序浏览
代码A 开启线程 走的是 线程流程,主函数 线程执行权比较强,执行完 再执行别的线程,线程有一种随机执行权的问题。
代码B  又没走线程流程,只是 普通一个线程,普通的调用 方法而已,按顺序执行呗。
回复 使用道具 举报
你好
开启线程使用start方法,run方法只是一个方法调用。
当开启多个线程的时候他们会和主线程抢夺cpu执行权,所以会出现交替执行的情况。
而调用run方法只是一个方法调用都在主线程内执行所以会按顺序执行。
回复 使用道具 举报
炉海佳 来自手机 高级黑马 2013-2-14 23:56:42
板凳
举例说明run()意思是你在写代码,然后叫你去扫地,你去扫地回来继续写代码,扫地写代码都是你一个人干的。而start()是你在写代码叫另一个人去扫地,你们两人同时进行,你们两就是两线程,效率肯定快
回复 使用道具 举报
start().会开启一一个线程,并调用run(). 如果直接写run()的话没有开启线程,所以程序中就只有主线程,所以就顺序执行了。
回复 使用道具 举报
其实在B中只有一个线程在使用CPU资源(main线程),你只是创建了两个线程,并没有启动。所以主线程是按照先后顺序执行的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马