优化ThreadUtil.safeSleep,使用System.nanoTime()

This commit is contained in:
Looly
2024-03-26 18:13:41 +08:00
parent 3fa431c5c1
commit bdc964c882
2 changed files with 15 additions and 10 deletions

View File

@@ -490,7 +490,7 @@ public class ThreadUtil {
/**
* 考虑{@link Thread#sleep(long)}方法有可能时间不足给定毫秒数此方法保证sleep时间不小于给定的毫秒数
*
* @param millis 给定的sleep时间
* @param millis 给定的sleep时间(毫秒)
* @return 被中断返回false否则true
* @see ThreadUtil#sleep(Number)
* @since 5.3.2
@@ -498,18 +498,14 @@ public class ThreadUtil {
public static boolean safeSleep(final long millis) {
long done = 0;
long before;
long spendTime;
while (done >= 0 && done < millis) {
before = System.currentTimeMillis();
// done表示实际花费的时间确保实际花费时间大于应该sleep的时间
while (done < millis) {
before = System.nanoTime();
if (!sleep(millis - done)) {
return false;
}
spendTime = System.currentTimeMillis() - before;
if (spendTime <= 0) {
// Sleep花费时间为0或者负数说明系统时间被拨动
break;
}
done += spendTime;
// done始终为正
done += (System.nanoTime() - before) / 1_000_000;
}
return true;
}

View File

@@ -101,4 +101,13 @@ public class ThreadUtilTest {
}, "线程 - " + x).start();
}
}
@Test
void safeSleepTest() {
final long sleepMillis = RandomUtil.randomLong(1, 1000);
// 随机sleep时长确保sleep时间足够
final long l = System.currentTimeMillis();
ThreadUtil.safeSleep(sleepMillis);
Assertions.assertTrue(System.currentTimeMillis() - l >= sleepMillis);
}
}