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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhangx 中级黑马   /  2013-4-17 20:14  /  1358 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zhangx 于 2013-4-18 14:01 编辑

复习中只是记住但不理解的问题:
为什么启动线程不能直接使用run()方法?而拐弯使用start()方法启动?这样做有什么好处?

点评

连着问了三个线程问题。。。  发表于 2013-4-18 04:03

5 个回复

倒序浏览
直接调用Thread类或Runnable类对象的run()方法,只会执行同一个线程的任务,而不会启动新线程。使用start方法,这个方法将创建一个执行run方法的新线程。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
  1.     public synchronized void start() {

  2.         if (threadStatus != 0)
  3.             throw new IllegalThreadStateException();

  4.         group.add(this);

  5.         boolean started = false;
  6.         try {
  7.             start0();
  8.             started = true;
  9.         } finally {
  10.             try {
  11.                 if (!started) {
  12.                     group.threadStartFailed(this);
  13.                 }
  14.             } catch (Throwable ignore) {
  15.             }
  16.         }
  17.     }

  18.     private native void start0();

  19.     @Override
  20.     public void run() {
  21.         if (target != null) {
  22.             target.run();
  23.         }
  24.     }
复制代码
其实看一下Thread类中相关方法的实现就明白了~

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
用 start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
所以调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
如果直接的调用run()方法,那么就不是多线程了,run()方法就成了普通的成员方法。start()的功能是创建一个线程,调用run()方法。这个你可以去Java API文档中看看。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
太混淆了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马