2020财年第四季度及全年业绩报告
如图,每个监视器(Monitor)在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”。而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()”。 术语难以理解,还是以皇帝的身份来潇洒一下。
这个时候,你还打算接见大臣。不过,现在不想再one by one了,因为这太低效太枯燥了。某个大臣在你的书房里待得长了些,就有可能有大臣怀疑你在搞gay,这种副作用让人心里不悦。 这还真不怕。因为阻塞并不会占用任何资源。 比如,小太监上报了一个折子,是关于吕嫔妃的舅舅的贪污问题处理。但是这个问题,需要等待司法调查的结果,还需要听听爱妃的意见,就先可以把它搁置在一旁。 把问题记录在一个其他的小册子里,等这些依赖的事办的差不多了,同时你又有龙时,那就可以继续处理。 可以看到,这种阻塞性的问题,虽然是个任务,但并不会占用你的任何时间,这在计算机中是一样的。 我们来看一下常见的Java阻塞方式。 sleep和wait 睡和等。用词很巧妙,到底妙在哪呢?因为它是现实中的场景。 sleep sleep函数会让线程在一定的时间内进入阻塞状态,不能得到cpu时间,但不会释放锁资源。指定的时间一过,线程重新进入可执行状态。 注意我们这里说的是线程,并不是CPU本身。线程不活动了,并不代表CPU不能干其他事情。 比如,今天是接见大臣的黄道吉日,王天师得到了接见的机会,其他的大臣们就得在外面等着被传唤。结果王天师的谈话又臭又长,勾不起你的任何兴趣。正好小太监急匆匆跑来,在你耳边悄悄说:李贵妃生了个儿子! 这是让人振奋的事情,因为其他儿子都在宫斗中被KO了。于是你装模作样的对王天师说:我现在有点头痛,需要小憩一会儿。” 其实你已经偷偷去探望李贵妃了。 注意,这个时候,王天师只能唯唯诺诺的等着。对于“接见”这个主线来说,其他的大臣也只能在外面等着被传唤。它们都没有拿到“接见”这把锁,王天师也一直占用着这把锁,直到你看完了儿子归来。 这就是sleep不释放锁的意思,因为sleep后,在sleep那一瞬间的任何东西都没有改变。 wait wait( ) 使线程进入阻塞状态,同时释放自己占有的锁资源,和notify( )搭配使用。
对于wait来说,就完全不一样了。 (编辑:唐山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |