调用 sleep 会让当前线程从 Running进入 Timed Waiting状态(阻塞)
其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException
睡眠结束后的线程未必会立刻得到执行
(资料图片仅供参考)
建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性(TimeUnit.SECONDS.sleep(1);)
调用sleep
public static void main(String[] args) { Thread t1 = new Thread("t1") { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }; t1.start(); log.debug("t1 state: {}", t1.getState()); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } log.debug("t1 state: {}", t1.getState()); }输出
22:23:02.365 c.Test6 [main] - t1 state: RUNNABLE22:23:02.893 c.Test6 [main] - t1 state: TIMED_WAITING调用interrupt
public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread("t1") { @Override public void run() { log.debug("enter sleep..."); try { Thread.sleep(2000); } catch (InterruptedException e) { log.debug("wake up..."); e.printStackTrace(); } } }; t1.start(); Thread.sleep(1000); log.debug("interrupt..."); t1.interrupt(); }输出
22:26:48.155 c.Test7 [t1] - enter sleep...22:26:49.158 c.Test7 [main] - interrupt...22:26:49.158 c.Test7 [t1] - wake up...java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at cn.itcast.test.Test7$1.run(Test7.java:14)调用 yield 会让当前线程从 Running进入 Runnable就绪状态,然后调度执行其它线程,注意:如果没有其他线程的话,可能还是执行当前线程
具体的实现依赖于操作系统的任务调度器
共同点:
1.都是Thread类中的类方法
2.都会导致正在执行的线程释放CPU
区别:
1.线程进入的状态不同:sleep方法导致线程进入到阻塞状态,yield方法导致线程进入就绪状态
2.是否考虑线程优先级:sleep方法不会考虑线程优先级,当一个线程调用sleep方法释放CPU后,所有优先级级别的线程都有机会获得CPU。yield方法会考虑线程优先级。当一个线程调用sleep方法释放CPU后,与该线程具有同等优先级,或优先级比该线程高的线程有机会获得CPU
3.可移植性:sleep方法比yield方法具有更好的可移植性
4.是否抛出异常:sleep方法声明抛出InterruptedException,而yield方法没有声明任何异常
5.是否有参数:sleep方法在Thread类中有两种重载形式,sleep(long ms),sleep(long ms,int nanos)yield方法没有参数
线程优先级会提示(hint)调度器优先调度该线程,但它仅仅是一个提示,调度器可以忽略它
如果 cpu 比较忙,那么优先级高的线程会获得更多的时间片,但 cpu 闲时,优先级几乎没作用
所以不一定优先级设置高就一定能有限执行,具体执行依赖任务调度器。
Runnable task1 = () -> { int count = 0; for (;;) { System.out.println("---->1 " + count++); }};Runnable task2 = () -> { int count = 0; for (;;) { // Thread.yield(); System.out.println(" ---->2 " + count++); }};Thread t1 = new Thread(task1, "t1");Thread t2 = new Thread(task2, "t2");// t1.setPriority(Thread.MIN_PRIORITY);// t2.setPriority(Thread.MAX_PRIORITY);t1.start();t2.start();这里读者可将注释去掉自行实践,即可体会yield与优先级的使用。
1、sleep与yieldsleep调用sleep会让当前线程从Running进入TimedWaiting状态(阻塞)其它线程可以使用interr
无锡三批次土拍正式挂地!共8幅地块!将于6月29日开拍!总起价75 7亿元!无锡第三批次地块挂牌,共8幅涉宅
【算力龙头爆发知名游资现身龙虎榜!京沪两地发布利好政策我国算力产业规模快速增长】工信部数据显示,中国
吃着热气腾腾的火锅,很多人喜欢搭配一瓶冰镇饮料,觉得解辣又降温。这种“一火一冰”的吃法可能带来生...
拓山重工:关于部分募集资金投资项目延期的公告
“立法院”今天三读通过增订证券投资信托及顾问法第70条之1,明定网路投资广告实名制,也禁登冒用名人引...
东方集团(SH600811,收盘价:2 33元)5月30日发布公告称,2023年6月15日14点30分,公司将在哈尔滨市南岗区
英伟达在COMPUTEX上再次展现了“芯基建狂魔”的硬核实力。集成了256个GH200芯片的DGXGH200
獐子岛涨停收盘,收盘价4 6元。该股于9点31分涨停,未打开涨停,截止收盘封单资金为4675 49万元,占其流通
2023东营中考分数线预测:东营市第一中学:615分;东营市第二中学:525分;胜利一中:640分;胜利二中:590
1、win+F打开控制台输入Fps_max999。2、关掉垂直同步。3、双核以上CPU打开游戏特效里多喝渲染,单核关闭
全市娱乐场所、互联网上网服务营业场所经营单位,考点校园周边出版物经营单位:高考(包括学考合格考)和中
据塔斯社报道,莫斯科市长索比亚宁在社交媒体平台Telegram上发布消息称,莫斯科几栋住宅楼在30日早上
1、2011年初一级招生问答1 问:关于学校的“性质”?答:我校是一所越秀区属的“国有民营”制初级中学...
1、厄贝沙坦片是降压药物,患有血压高的患者可以服用厄贝沙坦片,高血压患者平时要有良好的生活习惯,早睡
电商报快讯:5月30日消息,小米集团发布公告,于2023年5月29日斥资2306 16万港元回购220万股。于2023年5月2
铁矿石基本面 盘面:供给上,上周澳巴发运量有所回落但到港量小幅回升,未来将逐步季节性走高。非主流矿山
5月29日电,从今日举行的2023中关村论坛雄安智能城市论坛上获悉,截至目前,雄安新区新建区域每平方公里安
1、长虹液晶电视黑屏有声无像的可能原因;1 电视机切换到其他信号源,与机顶盒输出的视频信号不一致。2、解
1、正在开拍中听说是要拍成电视剧。2、可爱淘最近出了本新书叫本文到此分享完毕,希望对大家有所帮助。
1、不可竞争费就是指措施项目费中按费率计算的项目,比方说安全文明施工费、二次搬运费、冬雨季施工费、夜
原标题:深圳3000吨级海洋维权执法船建造项目下水仪式顺利举行(记者 张维聪通讯员 粤海综)5月24日上午,
家居连锁受让中联基金持有的目标股权和目标债权,目标股权和目标债权转让交易对价为16 04亿元。
5月28日,爱尔眼科发布公告,拟使用自有资金不低于3亿元且不超过5亿元以集中竞价交易方式回购公司部分社会
关于60岁以上农民工全部清退的问题一直是社会关注的焦点,虽然这一说法并不完全准确,但对于影响广泛的农民
X 关闭
X 关闭