提高Thread.Sleep的精度(摘)

本文演示了如何使用 C# 通过调用 winmm.dll 中的 timeBeginPeriod 和 timeEndPeriod 函数来改变系统的时钟更新频率,从而实现对线程睡眠时间更精确的控制。

 [DllImport("winmm.dll")]
internal static extern uint timeBeginPeriod(uint period);

[DllImport("winmm.dll")]
internal static extern uint timeEndPeriod(uint period);

{

Thread.Sleep(1); // wait's roughtly 15ms on my system
Thread.Sleep(2); // wait's roughtly 15ms on my system
Thread.Sleep(3); // wait's roughtly 15ms on my system

timeBeginPeriod(1);

Thread.Sleep(1); // wait's just over 1 ms on my system
Thread.Sleep(2); // wait's just over 2 ms on my system
Thread.Sleep(3); // wait's just over 3 ms on my system

timeEndPeriod(1);

Thread.Sleep(1); // wait's roughtly 15ms on my system
Thread.Sleep(2); // wait's roughtly 15ms on my system
Thread.Sleep(3); // wait's roughtly 15ms on my system

}

 

http://www.dotnet247.com/247reference/msgs/57/289291.aspx

### Java 中 `Thread.sleep` 不生效的原因及解决方案 在 Java 中,`Thread.sleep` 方法用于使当前线程暂停执行一段时间。然而,在某些情况下,可能会出现 `Thread.sleep` 不生效的现象。以下是可能的原因及相应的解决方案: #### 1. **系统时间调整** 如果系统时间被手动或自动调整(例如通过 NTP 同步),这可能会导致 `Thread.sleep` 的行为异常。`Thread.sleep` 的实现依赖于系统时钟,因此如果系统时钟被修改,可能导致线程提前唤醒或延迟唤醒[^4]。 **解决方案**: - 确保运行程序的系统时间不会被频繁调整。 - 使用高精度计时器(如 `System.nanoTime()`)来验证睡眠时间是否符合预期。 #### 2. **线程被中断** 当线程正在休眠时,如果另一个线程调用了该线程的 `interrupt()` 方法,则会抛出 `InterruptedException`,从而导致 `Thread.sleep` 提前结束[^2]。 **解决方案**: - 捕获 `InterruptedException` 并根据需要重新抛出或处理。 ```java try { Thread.sleep(1000); } catch (InterruptedException e) { // 处理中断异常 Thread.currentThread().interrupt(); // 恢复中断状态 } ``` #### 3. **线程优先级问题** 虽然 `Thread.sleep` 应该让线程暂停指定的时间,但在某些低优先级线程中,可能会因为调度问题而无法准确执行。这种情况下,线程可能在未达到预期时间时就被唤醒[^1]。 **解决方案**: - 避免过度依赖线程优先级,确保所有线程的优先级设置合理。 - 使用 `ScheduledExecutorService` 等更高级的并发工具替代 `Thread.sleep`。 #### 4. **硬件或操作系统限制** 在某些操作系统或硬件平台上,`Thread.sleep` 的最小分辨率可能高于请求的时间(例如,请求 1 毫秒的睡眠,但实际可能需要 10-15 毫秒)。这是由于操作系统的定时器分辨率限制所致[^3]。 **解决方案**: - 如果需要更高精度的定时,可以考虑使用忙等待(busy-waiting)或其他精确计时机制,但需注意性能开销。 - 示例代码: ```java long startTime = System.nanoTime(); while ((System.nanoTime() - startTime) < TimeUnit.MILLISECONDS.toNanos(1)) { Thread.onSpinWait(); // 提示 JIT 编译器优化忙等待 } ``` #### 5. **代码逻辑错误** 如果 `Thread.sleep` 被放置在循环或条件语句中,可能会因为逻辑错误而导致其看似不生效。例如,循环中的条件判断可能提前终止了线程的睡眠[^2]。 **解决方案**: - 仔细检查代码逻辑,确保 `Thread.sleep` 被正确调用。 - 示例代码: ```java boolean b = false; new Thread(() -> { try { while (!b) { Thread.sleep(1000); // 确保条件为 true 时退出循环 } } catch (InterruptedException e) { e.printStackTrace(); } }).start(); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值