黑马程序员技术交流社区
标题:
多线程有个疑问!
[打印本页]
作者:
lwh316658735
时间:
2014-11-30 13:36
标题:
多线程有个疑问!
本帖最后由 lwh316658735 于 2014-11-30 13:38 编辑
我们继承Thread,API中告诉我们覆盖Run方法。但是API中的
start
()方法也没有说明不能覆盖,如果我们覆盖了会是什么情况呢?
作者:
DamonZh
时间:
2014-11-30 14:33
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
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