线程的礼让问题

同学请坐の 2018-08-24 12:54:52
为什么有时i==3的时候会输出线程礼让,而有时不输出呢???求解
...全文
459 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2018-09-14
  • 打赏
  • 举报
回复
建议你在“线程礼让“前也加个线程名不就一目了然了。
qq_39936465 2018-09-14
  • 打赏
  • 举报
回复
其实都输出了,不过是显示误导了你,因为进程执行时间有误差的。

第一个情况是 a进程执行到i=3 并打印了 进程名,但还没有执行了礼让,这时候 b进程也执行了i=3 并先与a执行礼让打印了 进程名,然后a进程执行礼让后,b进程执行礼让。

第2个情况是 a进程执行更快执行过了打印进程名,并开始执行礼让时 b进程还没有执行 i=3 后的打印进程名。

这种情况发生很正常。
Dan淡淡的心 2018-08-24
  • 打赏
  • 举报
回复
Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉, 让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。 yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保 证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行! 举个例子:一帮朋友在排队上公交车,轮到Yield的时候,他突然说:我不想先上去了,咱们大家来竞赛上公交车。然后所有人就一块冲向公交车, 有可能是其他人先上车了,也有可能是Yield先上车了。 但是线程是有优先级的,优先级越高的人,就一定能第一个上车吗?这是不一定的,优先级高的人仅仅只是第一个上车的概率大了一点而已, 最终第一个上车的,也有可能是优先级最低的人。并且所谓的优先级执行,是在大量执行次数中才能体现出来的。
Surrin1999 2018-08-24
  • 打赏
  • 举报
回复
我以为你说怎么有时没输出= = 不过回答的方向是对的
Surrin1999 2018-08-24
  • 打赏
  • 举报
回复
你这个不是都输出了吗....上面那种情况是刚输出完A正在执行3 另一个线程就抢走了CPU控制权, 输出它的B正在执行3 然后各自礼让 输出对应的线程礼让: 下面那个是礼让语句执行了但没有交出CPU控制权(礼让机制并不能保证另一个线程一定拿到CPU控制权 真正要做到请加同步锁 ) 所以会继续输出线程礼让
qq_37257058 2018-08-24
  • 打赏
  • 举报
回复
线程礼让你改成换行输出,我觉得只是输出的格式困扰了你,没弄清问题本质,没你说的什么输出不输出的问题

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧