triggerTime(long delay)方法中为什么要判断delay < (Long.MAX_VALUE >> 1)?
时间: 2024-04-17 09:28:24 浏览: 78
在调度线程池执行器中,判断 `delay < (Long.MAX_VALUE >> 1)` 的目的是为了避免在计算触发时间时出现溢出的情况。
`Long.MAX_VALUE` 是 Java 中 `long` 类型的最大值,它表示一个固定的极大值。当我们进行计算时,如果 delay 的值接近 `Long.MAX_VALUE`,那么在计算 `triggerTime = System.currentTimeMillis() + delay` 时,可能会导致溢出。
为了避免溢出,通过判断 `delay < (Long.MAX_VALUE >> 1)`,即 delay 是否小于 `Long.MAX_VALUE` 的一半,确保 delay 的值足够小,不会导致溢出。右移一位相当于除以2,所以 `(Long.MAX_VALUE >> 1)` 表示 `Long.MAX_VALUE` 的一半。
这个判断条件是一种保守的做法,确保在计算触发时间时不会出现溢出问题,以提高代码的健壮性和可靠性。
相关问题
CREATE TRIGGER tr_employee_job_lvl ON employee AFTER INSERT, UPDATE AS BEGIN IF EXISTS ( SELECT 1 FROM inserted i INNER JOIN job j ON i.job_id = j.job_id WHERE i.job_lvl < j.min_lvl OR i.job_lvl > j.max_lvl ) BEGIN RAISERROR('Job level is not within the acceptable range', 16, 1) ROLLBACK TRANSACTION RETURN END END详细注释
这是一条 SQL Server 触发器的语句,用于在 employee 表插入或更新数据时检查 job_lvl 是否在其所属的 job 表中的 min_lvl 和 max_lvl 范围内。
触发器名称为 tr_employee_job_lvl,表示在 employee 表中插入或更新数据时触发该触发器。
语句的 BEGIN 和 END 之间是触发器的主体部分,其中包含了一个 IF 语句,用于判断插入或更新的数据是否符合要求。
在 IF 语句中,首先使用了 EXISTS 子句来检查是否存在符合条件的记录。在这里,我们使用了 inserted 和 job 两个表,其中 inserted 表是一个特殊的表,用于存储刚刚插入或更新的数据,job 表是 employee 表中 job_id 字段所对应的表。
在 EXISTS 子句中,我们通过 INNER JOIN 连接了 inserted 表和 job 表,并限制了一个条件,即 i.job_id = j.job_id,表示两个表中 job_id 字段相等。然后,我们使用了 WHERE 子句来限制一个条件,即 i.job_lvl < j.min_lvl OR i.job_lvl > j.max_lvl,表示如果 job_lvl 不在 min_lvl 和 max_lvl 的范围内,则数据不符合要求。
如果存在符合条件的记录,则触发器会使用 RAISERROR 函数生成一个错误消息,提示 job level 不在接受范围内,错误级别为 16,状态为 1。然后,使用 ROLLBACK TRANSACTION 回滚事务,撤销刚刚插入或更新的数据。最后,使用 RETURN 关键字结束触发器的主体部分。
这个触发器的作用是保证 employee 表中的 job_lvl 字段符合 job 表中的 min_lvl 和 max_lvl 的要求,避免了数据不一致的问题。
def input(self): keys = pygame.key.get_pressed() if self.can_move: if keys[pygame.K_RIGHT] and self.selection_index < self.attribute_nr - 1: self.selection_index += 1 self.can_move = False self.selection_time = pygame.time.get_ticks() elif keys[pygame.K_LEFT] and self.selection_index >= 1: self.selection_index -= 1 self.can_move = False self.selection_time = pygame.time.get_ticks() if keys[pygame.K_SPACE]: self.can_move = False self.selection_time = pygame.time.get_ticks() self.item_list[self.selection_index].trigger(self.player)
```
def input(self):
"""
处理用户输入
"""
keys = pygame.key.get_pressed()
if self.can_move:
# 如果允许移动
if keys[pygame.K_RIGHT] and self.selection_index < self.attribute_nr - 1:
# 如果按下右键并且当前选择索引小于属性数量减一
self.selection_index += 1
self.can_move = False
self.selection_time = pygame.time.get_ticks()
elif keys[pygame.K_LEFT] and self.selection_index >= 1:
# 如果按下左键并且当前选择索引大于等于1
self.selection_index -= 1
self.can_move = False
self.selection_time = pygame.time.get_ticks()
if keys[pygame.K_SPACE]:
# 如果按下空格键
self.can_move = False
self.selection_time = pygame.time.get_ticks()
# 触发当前选择的UI元素
self.item_list[self.selection_index].trigger(self.player)
```
这段代码是一个处理用户输入的函数。在该函数中,首先获取用户按键情况,并判断是否允许移动。如果允许移动,且用户按下了右键,并且当前选择的属性索引小于属性数量减一,则将选择的属性索引加一,并设置移动标志和选择时间。如果用户按下了左键,并且当前选择的属性索引大于等于1,则将选择的属性索引减一,并设置移动标志和选择时间。如果用户按下了空格键,则将移动标志设置为False,并触发当前选择的UI元素,即调用当前item_list列表中索引为选择的属性索引的元素的trigger()方法,并向其传递玩家对象作为参数。注释解释了该函数的功能和各个变量的含义。
阅读全文