多线程:为什么不能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方法的场景都可以被其他方式更好地替代。例如类变量。事件机制,监听等方式。

转载于:https://my.oschina.net/sudojs/blog/287857

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值