mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
优化ThreadUtil.safeSleep,使用System.nanoTime()
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user