请问,在这个例子中,为什么不能用 thread.sleep(1000),而只能用 Thread.sleep(1000)
IDE提示,也可以改为 WrongWayStopThread.sleep(1000)
这里的 Thread是否等同于 thread呢?
IDE提示,也可以改为 WrongWayStopThread.sleep(1000)
这里的 Thread是否等同于 thread呢?
2015-08-01
首先你要知道一个概念:
main方法本身就是一个线程。
所以该程序有2个线程。
然后你要明白sleep方法是什么意思,老办法,查API文档(我推荐大家坚持看英文文档,英语对程序员至关重要):
“Causes the currently executing thread to sleep (cease execution)for the specified number of milliseconds plus the specified number of nanoseconds, subject to the precision and accuracy of system timers and schedulers. The thread does not lose ownership of any monitors.”
“Causes the currently executing thread to sleep...”使当前正在执行的线程sleep。我猜想你程序中thread.sleep()是想让thread线程sleep吧?其实是不可以的,编译会自动处理成Thread.sleep。而为什么又可以改成WrongWayStopThread.sleep呢?因为WrongWayStopThread继承自Thread呀,static方法可以被继承(无法被重写),classname.method哪里不对呢?
同时,对这个问题理解了也就理解为什么run方法里不能用Thread.sleep(1000)了。老师也讲了doc中的内容,我就不贴了,意思就是:
与sleep() wait() jion()相关的方法会clear掉interrupt status,导致while (!this.isInterrupted())的判断出现并不稳定性()。是不是很官方O__O "…(都这尿性,但严谨的说确实是这样,习惯就好),说简单但不严谨点了就是你调用这些方法就会重置interrupt status,所以这里while中使用Thread.sleep(1000)就会让while的判断条件的返回值一直为true。(注意这里返回的native boolean isInterrupted不是上文中的interrupt status,interrupt status是由系统底层决定的,所以上面用clear)
还有我认为如果main中的thread.interrupt()(此方法会直接将native boolean isInterrupted标记为true)刚好在run中的Thread.sleep(1000)之前,while (!this.isInterrupted())之后执行的话,程序会出现bug——正常执行(-__-)b。
以上纯属瞎掰
另外昨晚看到一篇关于程序员学习英语的文章觉得很棒,这里贴过来:
还有严重批评1楼不负责任的回答。(╬▔皿▔)╬
加油小伙伴们。
举报