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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张青峰 黑马帝   /  2012-2-9 00:01  /  9592 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张青峰 于 2012-2-9 09:02 编辑

为什么启动多线程时不能直接调用run()方法,而必需通过start()方法启动?

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

8 个回复

倒序浏览
虽然run()方法实现了多个线程的并行处理,但不能直接调用run()方 法,而是通过start()方法来调用.在调用start()的时候,start方法会首先 进行与多线程相关的初始化,然后再自动调用run()方法.
回复 使用道具 举报
本帖最后由 钱兆元 于 2012-2-9 00:10 编辑
  1. public class TestThread1 {  
  2.     public static void main(String[] args) {  
  3.         Runner1 r = new Runner1();  
  4. //       r.run();//这是方法调用,而不是开启一个线程  
  5.         Thread t = new Thread(r);// 调用了Thread(Runnable target)方法。且父类对象变量指向子类对象。  
  6.         t.start();  
  7.         for (int i = 0; i < 100000; i++) {  
  8.              if(i%10000==0){  
  9.                  System.out.println("main");  
  10.              }  
  11.         }  
  12.     }  
  13.     /*
  14.      * run的运行结果:
  15.      * 先显示10个thread,再来上10个main,
  16.      * 表示使用run方法调用的时候相当于一般的过程调用,并没有加入到线程中区
  17.      * start的运行结果:
  18.      * thread和main是穿插进行的,就表示该方法已经加入了线程中去
  19.      */  
  20. }  
  21. class Runner1 extends Thread {   
  22.     public void run() {  
  23.         for (int i = 0; i < 100000; i++) {  
  24.              if(i%10000==0){  
  25.                  System.out.println("thread");  
  26.              }  
  27.         }  
  28.     }  
  29. }  
复制代码
run方法中存放的是线程运行任务代码,start方法开启线程,实现多线程。
调用start方法开启线程并运行run方法。

评分

参与人数 1技术分 +2 收起 理由
唐秀启 + 2 赞一个!

查看全部评分

回复 使用道具 举报
run是线程运行的过程,start只是给线程运行一个口令罢了,就好比运动员跑步,须等裁判吹口哨才能跑起来
如果说没有用start方法,那么run方法只能放在Thread的构造方法中去完成了,这样Thread只是一个普通的java对象,此时在Thread构造方法中打印当前线程名称仍然是Thread-main,此时的new Thread()就是一个简单的java对象,而不能起到线程的作用

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
run方法只是用于存放线程要运行的代码,调用run方法只是执行该方法,就是很普通的调用方法,不能同时运行多个run方法,因此并未达到多线程的目的,start方法是先开启线程,随后再调用Runnable接口子类中的run方法,若要多线程的话,只需再start其他线程就行了

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
start 就调用了run方法的。 直接调用就是主线程了,通过start 调用了run的同时还启动线程!
回复 使用道具 举报
任奇 黑马帝 2012-2-9 11:46:33
7#
虽然run()方法实现了多个线程的并行处理,但不能直接调用run()方法,而是通过start()方法来调用。在调用start()的时候,start方法会首先进行与多线程相关的初始化,然后再自动调用run()方法。
start()方法
– 线程调用该方法启动一个线程,使之从新建状态进入就绪队列排队,一旦轮到它来使用CPU资源时,就可以脱离创建它的主线程独立开始自己的生命周期。
run()方法
– 线程的所有活动都是通过线程体run()方法来定义并实现它被调用以后所执行的操作。
回复 使用道具 举报
start()方法自动建立并启动线程,使之进入就绪态,当CPU给它分配时间时,由JVM调度执行run()方法。当然,一个start()方法可以启动多个线程,而一个run()方法只能执行输入自己的代码体
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马