本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
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一样。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » Thread.sleep 教程