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时间不小于给定的毫秒数
|
* 考虑{@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;
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user