Thread.sleep 相信大家并不陌生。在 java 中代表将当前线程挂起指定的毫秒数。并会抛出一个 InterruptedException 异常。关于 Thread.sleep() 方法的用法,本文将详细的介绍。
Theard在编程里是线程的意思,Sleep是休眠的意思。
线程休眠方法是当我们Thread.Strart(线程名)线程启动方法时,他使用Thread.Sleep(时间),进行时间延迟,对多个线程进行排队,或者说是对单个线程进行等待操作。
Thread.Sleep 的参数是一个 long 类型的参数。例如下面的例子是代表当前线程挂起等待3秒。
try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }
Javadoc 对该方法的描述如下:
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.The thread does not lose ownership of any monitors.
在Java字节码层面,获取锁的字节码指令为:monitorenter,释放锁的字节码指令为:monitorexit,所以我个人认为doc里的monitors可以理解为对象锁。
也就是说,调用sleep()方法后进入休眠状态的线程并不会释放其持有的对象锁。
有时候,我们会发现某些项目中会出现 Thread.Sleep(0) 这样的代码。休眠 0 毫秒是什么意思呢?是不是写错了呢?
答案当然不是写错了。我们都知道线程是有优先级的,Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次 CPU竞争”。竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。这也是我们在大循环里面经常会写一句 Thread.Sleep(0) ,因为这样就给了其他线程比如Paint线程获得CPU控制权的权力,这样界面就不会假死在那里。末了说明一下,虽然上面提到说“除非它自己放弃使用 CPU ,否则将完全霸占 CPU”,但这个行为仍然是受到制约的——操作系统会监控你霸占CPU的情况,如果发现某个线程长时间霸占CPU,会强制使这个线程挂起,因此在实际上不 会出现“一个线程一直霸占着 CPU 不放”的情况。至于我们的大循环造成程序假死,并不是因为这个线程一直在霸占着CPU。实际上在这段时间操作系统已经进行过多次CPU竞争了,只不过其他 线程在获得CPU控制权之后很短时间内马上就退出了,于是就又轮到了这个线程继续执行循环,于是就又用了很久才被操作系统强制挂起。因此反应到界面 上,看起来就好像这个线程一直在霸占着CPU一样。
: » Thread.sleep 教程
原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/251712.html