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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lwh316658735 中级黑马   /  2014-11-30 13:36  /  1545 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lwh316658735 于 2014-11-30 13:38 编辑

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

5 个回复

倒序浏览
  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而没有达到调用平台的开启线程的方法的话,线程应该是启动不了的

评分

参与人数 1黑马币 +3 收起 理由
sk0806 + 3 赞一个!

查看全部评分

回复 使用道具 举报
DamonZh 发表于 2014-11-30 14:33
最终调用的是native的方法,如果你复写start而没有达到调用平台的开启线程的方法的话,线程应该是启动不了 ...

虽然没看懂,不过还是感谢了。
回复 使用道具 举报
start()是用来启动线程的,你把覆盖了就是用你写的start方法而不是启动线程了。就好像你把一个类的toString覆盖了就不会使用系统默认的toString而是使用你定义的toString了
回复 使用道具 举报
高手,底层一定研究的灰常的透彻。。。。
回复 使用道具 举报
复写结果基本就是你启动不了这个线程。2楼发的start方法实现的源代码,而start又调用了start0方法,这个方法被native修饰,表示是调用的系统的底层资源。。。如果你能在不依靠系统平台的状态下启动线程,那你就覆写start方法吧。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马