黑马程序员技术交流社区

标题: Thread.start()与Thread.run()有什么区别? [打印本页]

作者: nanfp    时间: 2015-7-6 22:58
标题: Thread.start()与Thread.run()有什么区别?
本帖最后由 nanfp 于 2015-7-7 16:14 编辑

Thread.start()与Thread.run()有什么区别?看视频没有搞懂这个问题,请大家帮忙解释一下:handshake
作者: 凶狠搞Android    时间: 2015-7-6 23:41
Thread.start()方法,其实是做了两件事: 第一,它启动了线程, 第二, 它调用了run()方法.
而 Thread.run()方法,实际上并没有启动线程, 而是主线程去调用该对象的run()方法,
所以说,如果仅仅是Thread.run(),那么主线程会先跳到run()方法里执行, 执行完了,会继续往下执行下面的代码...

不知道这样说,你能不能明白其中的区别

下面贴出来两段代码, 楼主如果还是不太理解的话,试着结合代码的运行结果来分析,应该可以理解到..

代码一: 测试Thread.run():
  1. class RunTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Test t = new Test();

  6.                 Thread t1 = new Thread(t);
  7.                 t1.run();

  8.                 //主线程也执行同样的循环,以示区别.
  9.                 for (int x=0; x<10 ;x++ )
  10.                 {
  11.                         System.out.println("-----main");
  12.                 }
  13.         }
  14. }

  15. class Test implements Runnable
  16. {
  17.         //覆写run()方法
  18.         public void run()
  19.         {
  20.                 for (int x=0; x<10 ;x++ )
  21.                 {
  22.                         System.out.println("Test-----");
  23.                 }
  24.                
  25.         }
  26. }
复制代码

运行结果:




代码二 :  测试Thread.start();
  1. class StartTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Test1 t = new Test1();

  6.                 Thread t1 = new Thread(t);
  7.                 t1.start();

  8.                 //主线程也执行同样的循环,以示区别.
  9.                 for (int x=0; x<10 ;x++ )
  10.                 {
  11.                         System.out.println("-----main");
  12.                 }
  13.         }
  14. }

  15. class Test1 implements Runnable
  16. {
  17.         //覆写run()方法
  18.         public void run()
  19.         {
  20.                 for (int x=0; x<10 ;x++ )
  21.                 {
  22.                         System.out.println("Test1-----");
  23.                 }
  24.         }
  25. }
复制代码
运行结果:


提醒: 由于循环次数比较少,出现的结果可能与我这边的结果不太一样, 如果很多次都没有这样的交替出现的打印结果,楼主可以尝试修改代码中for循环的次数,修改大一点,效果会更加明显.



作者: 430422    时间: 2015-7-6 23:51
牛啊,大神!
作者: 改变    时间: 2015-7-7 00:39
调用start()方法才会启动子线程,调用run()方法是主线程去执行的,有很大的区别。
作者: 曹操001    时间: 2015-7-7 02:03
回答好详细,受教了!
作者: nanfp    时间: 2015-7-8 09:35
凶狠搞Android 发表于 2015-7-6 23:41
Thread.start()方法,其实是做了两件事: 第一,它启动了线程, 第二, 它调用了run()方法.
而 Thread.run()方法 ...

牛!!谢谢你的详细讲解,看明白了:victory:
作者: 慕容旺财    时间: 2015-7-8 10:11
问得好 start()也调用run() 但没有开启多线程的功能 也就是说 start()是程序分叉的起点 run不是
作者: 帅帅loyal    时间: 2015-7-8 10:45
顶二楼,,
作者: dajiaoya    时间: 2015-7-8 13:16
分享快乐 赞一个




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