多线程的猴子

猴子要求

河的左岸有一群猴子,右岸也有一群猴子。左岸的猴子想到右岸,右岸的猴子想到左岸。
一只猴子在某时刻选择并爬上某个梯子,意味着它从其“出生地”跳到了该梯子在猴子所在一侧的第 1 个踏板上。猴子一旦上了某个梯子,就不能在中途跳到别的梯子上。 梯子太窄,一只猴子无法越过在其前方同向行进的其他猴子,只能跟随其后(意即:只有在其前方的猴子向前行进腾出了空间,该猴子才能向前进)。猴子无法越过在其前方的对向行进的猴子,也无法在梯子上后退。若在同一架梯子上有两只对向行进的猴子相遇,则此时产生了“死锁”,过河失败。每个猴子过河的速度不同,其速度?定义为每秒钟可爬过的踏板的数量。在 独占一部梯子过河的情况下,一只速度为?的猴子过河所需的时间为ℎ ? 秒。如果有 另一只猴子在它前方但速度比它慢,则它的行进速度不得不降低。如果ℎ ≤ ?,在猴子跳上梯子且前方没有其他猴子阻挡的情况下,其过河时间为1秒。

梯子选择的考虑

猴子刚生成时需要选择梯子,这时候如果已经有其他猴子在所选梯子的第一个踏板,这时候猴子不能跳上该梯子
这时候有两个选择:
1.猴子在下一秒决策时重新选择梯子
2.猴子在所选梯子等待,等待梯子第一个踏板的猴子离开
在初始选择2策略时发现性能比1策略差。
猜想:策略2梯子不能再改变,有可能有更好的梯子选择。

猴子线程的想法

利用同步synchronized

1选择梯子
选择梯子需要利用循环保证其能选到,在循环中,将选择梯子并设置梯子上含有该猴子锁住,以共享的梯子为锁,保证每个猴子选择成功并设置梯子后才能进行下一个猴子选择梯子。
在这里插入图片描述

2等待梯子第一个踏板
我采取的是猴子可以在别的猴子占据第一个踏板时仍然选取该梯子,这时候需要一直判断梯子第一个踏板为空,时间为每一秒判断一次,这里也需要使用锁,对象为所在的梯子,保证一个猴子跳上去后其他猴子不能跳上去。

3运动策略
以所在梯子为锁,保证每个猴子都以当前其他猴子所在位置运动,并且在下一秒修改成应到的位置。
在这里插入图片描述
这里采用在当前秒猴子不修改状态,然后再挂起0.9秒,保证所有猴子已经根据之前状态选择正确位置时,修改猴子位置(之前位置改为正确位置)。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值