黑马程序员技术交流社区

标题: 多线程有个疑问! [打印本页]

作者: lwh316658735    时间: 2014-11-30 13:36
标题: 多线程有个疑问!
本帖最后由 lwh316658735 于 2014-11-30 13:38 编辑

我们继承Thread,API中告诉我们覆盖Run方法。但是API中的start()方法也没有说明不能覆盖,如果我们覆盖了会是什么情况呢?

作者: DamonZh    时间: 2014-11-30 14:33
  1. public synchronized void start() {
  2.         /**
  3.          * This method is not invoked for the main method thread or "system"
  4.          * group threads created/set up by the VM. Any new functionality added
  5.          * to this method in the future may have to also be added to the VM.
  6.          *
  7.          * A zero status value corresponds to state "NEW".
  8.          */
  9.         if (threadStatus != 0)
  10.             throw new IllegalThreadStateException();

  11.         /* Notify the group that this thread is about to be started
  12.          * so that it can be added to the group's list of threads
  13.          * and the group's unstarted count can be decremented. */
  14.         group.add(this);

  15.         boolean started = false;
  16.         try {
  17.             start0();
  18.             started = true;
  19.         } finally {
  20.             try {
  21.                 if (!started) {
  22.                     group.threadStartFailed(this);
  23.                 }
  24.             } catch (Throwable ignore) {
  25.                 /* do nothing. If start0 threw a Throwable then
  26.                   it will be passed up the call stack */
  27.             }
  28.         }
  29.     }

  30.     private native void start0();
复制代码

最终调用的是native的方法,如果你复写start而没有达到调用平台的开启线程的方法的话,线程应该是启动不了的
作者: lwh316658735    时间: 2014-11-30 14:42
DamonZh 发表于 2014-11-30 14:33
最终调用的是native的方法,如果你复写start而没有达到调用平台的开启线程的方法的话,线程应该是启动不了 ...

虽然没看懂,不过还是感谢了。
作者: 冥夜    时间: 2014-11-30 14:54
start()是用来启动线程的,你把覆盖了就是用你写的start方法而不是启动线程了。就好像你把一个类的toString覆盖了就不会使用系统默认的toString而是使用你定义的toString了

作者: scoto263    时间: 2014-11-30 15:06
高手,底层一定研究的灰常的透彻。。。。
作者: as604049322    时间: 2014-12-1 11:10
复写结果基本就是你启动不了这个线程。2楼发的start方法实现的源代码,而start又调用了start0方法,这个方法被native修饰,表示是调用的系统的底层资源。。。如果你能在不依靠系统平台的状态下启动线程,那你就覆写start方法吧。




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