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

View File

@@ -101,4 +101,13 @@ public class ThreadUtilTest {
}, "线程 - " + x).start(); }, "线程 - " + 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);
}
} }