多线程:为什么不能override start方法

多线程的简单写法是:继承Thread类,然后覆写run方法(写一些需要做的事),然后再客户端程序中调用对象的start方法就能启动一个线程。但是为什么不能override start方法呢???

观察:
带着问题看源码:
看Thread类的源码:
一个synchronized的start方法,返回值void
首先判断线程状态必须是未启动状态,否则抛出非法线程状态异常,
然后加入到线程组中。
之后执行start0()方法:分配栈内存, 启动线程。运行run方法。
然后,在启动前设置了停止状态
这就是主要步骤。

分析:重点在于start0()方法,这是一个 native方法,即本地方法。它做了:启动线程,申请栈内存,运行run方法,修改线程状态等事情。线程的管理和内存的管理都是由JVM负责。如果你要override start方法,也就是说,你要撤销线程的管理和栈内存管理功能,这样注定是启动失败。我们不需要关注线程和内存的管理,JVM都为我们做了,我们只需要在run方法体中写一些多线程的逻辑即可。JVM简化了多线程的应用。

有人非要较劲,就是要override start方法:罕见的做法,其实也很简单,只需要在复写的start方法中写上super.start()方法即可。
必须要要说:所以要复写start方法的场景都可以被其他方式更好地替代。例如类变量。事件机制,监听等方式。

你可能感兴趣的:(多线程:为什么不能override start方法)