黑马程序员技术交流社区

标题: 线程启动问题? [打印本页]

作者: zhangx    时间: 2013-4-17 20:14
标题: 线程启动问题?
本帖最后由 zhangx 于 2013-4-18 14:01 编辑

复习中只是记住但不理解的问题:
为什么启动线程不能直接使用run()方法?而拐弯使用start()方法启动?这样做有什么好处?
作者: J_hom    时间: 2013-4-17 20:26
直接调用Thread类或Runnable类对象的run()方法,只会执行同一个线程的任务,而不会启动新线程。使用start方法,这个方法将创建一个执行run方法的新线程。
作者: 杨冉    时间: 2013-4-17 20:29
  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类中相关方法的实现就明白了~
作者: 孤独的鸟人    时间: 2013-4-17 22:12
用 start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
所以调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
作者: 刘兆华    时间: 2013-4-17 23:52
如果直接的调用run()方法,那么就不是多线程了,run()方法就成了普通的成员方法。start()的功能是创建一个线程,调用run()方法。这个你可以去Java API文档中看看。
作者: zhangx    时间: 2013-4-18 14:01
太混淆了




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