执行延时检测方式

#if TRUE

          RETAILMSG(TRUE, (TEXT("******** +delay 2s/r/n")));

           for (int nCount = 0; nCount < 99 * 1000 * 1000 * 2; nCount++)

           ;

           RETAILMSG(TRUE, (TEXT("******** -delay 2s/r/n")));

#endif  

 

void Delay_us(int n)

{

LARGE_INTEGER litmp;

LONGLONG QPart1,QPart2;

double dfMinus,dfFreq,dfTim;

QueryPerformanceFrequency(&litmp);

dfFreq = (double)litmp.QuadPart;

QueryPerformanceCounter(&litmp);

QPart1 = litmp.QuadPart;

do

{

QueryPerformanceCounter(&litmp);

QPart2 = litmp.QuadPart;

dfMinus = (double)(QPart2-QPart1);

dfTim = dfMinus/dfFreq;

}while(dfTim<0.000001*n);

}

 

<think>好的,用户现在问的是“同步延时执行”,我需要先理解他的需求。之前他问的是Spring Boot中的延时执行,我给出了六种方案,大部分是异步的。现在他可能混淆了同步和延时的概念,或者有特定的同步延时需求。 首先,同步延时通常意味着在当前线程中阻塞一段时间,比如Thread.sleep(),这样后面的操作会在延时后继续执行。而异步延时则是将任务提交到其他线程,主线程继续执行。用户可能需要在某个业务逻辑中等待一段时间后再继续处理,但又不希望引入多线程的复杂性。 我需要明确同步延时的适用场景,比如测试、简单脚本,或者必须按顺序执行的场景。同时也要指出其缺点,比如阻塞主线程导致性能问题,特别是在Web应用中会严影响吞吐量。 然后要对比同步和异步的区别,确保用户明白两者的不同。可能用户之前看到的方案都是异步的,现在需要同步的方法,所以需要给出正确的实现方式,比如使用Thread.sleep(),或者结合CountDownLatch等工具。 还要考虑用户是否有其他隐藏需求,比如是否在Spring Boot的上下文中需要同步延时,这时候要提醒在Controller中使用同步延时的风险,比如导致请求线程阻塞,影响服务器性能。 最后,给出最佳实践建议,推荐在大多数情况下使用异步,只有在特定简单场景下才用同步,并提供代码示例和注意事项,比如异常处理、中断响应等。</think>在Java中实现 **同步延时执行**(即阻塞当前线程的延时)主要有以下 **5种核心方法**,根据使用场景选择合适方案: --- ### 一、基础阻塞方案:Thread.sleep() ```java public void syncDelayDemo() { System.out.println("开始执行: " + LocalDateTime.now()); try { Thread.sleep(3000); // 同步阻塞3秒 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("3秒后继续执行: " + LocalDateTime.now()); } ``` **特点**: - 简单直接,适用于单线程简单场景 - 阻塞当前线程,不消耗额外资源 - 需处理 `InterruptedException` 异常 --- ### 二、Object.wait() 方案(带条件控制) ```java public synchronized void waitDelay(long millis) { try { this.wait(millis); // 释放对象锁的等待 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } ``` **适用场景**: - 需要结合线程间通信的延时 - 允许其他线程通过 `notify()` 提前唤醒 --- ### 三、CountDownLatch 同步器方案 ```java public void countDownLatchDemo() throws InterruptedException { CountDownLatch latch = new CountDownLatch(1); new Thread(() -> { try { Thread.sleep(2000); latch.countDown(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }).start(); latch.await(); // 主线程同步等待 System.out.println("2秒后继续执行"); } ``` **优势**: - 可与其他线程配合实现精准同步 - 支持超时设置 `await(long timeout, TimeUnit unit)` --- ### 四、循环检测方案(CPU忙等待) ```java public void busyWait(long millis) { long start = System.currentTimeMillis(); while (System.currentTimeMillis() - start < millis) { // 空循环(实际开发不推荐) } } ``` **注意**: - ❌ 严消耗CPU资源 - 仅用于特殊测试场景,生产环境禁用 --- ### 五、ScheduledExecutorService 模拟同步 ```java public void pseudoSyncDelay() throws Exception { ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); Future<?> future = executor.schedule(() -> { System.out.println("延时操作"); }, 3, TimeUnit.SECONDS); future.get(); // 通过Future.get()实现阻塞 executor.shutdown(); } ``` **特点**: - 使用线程池但通过 `Future` 强制同步等待 - 相比纯阻塞更易管理线程资源 --- ### 同步 vs 异步延时对比 | 特性 | 同步延时 | 异步延时 | |--------------------|----------------------------|----------------------------| | 线程阻塞 | 当前线程停止执行 | 新线程执行,原线程继续 | | 资源消耗 | 低(无上下文切换) | 中(需要线程管理) | | 适用场景 | 简单脚本/必须顺序执行的逻辑 | 并发要求高的服务端程序 | | 异常传播 | 直接抛出到当前线程 | 需要通过回调/Future处理 | | 典型实现 | Thread.sleep() | ScheduledExecutorService | --- ### 最佳实践建议 1. **Web应用避免同步延时** ```java // ❌ 错误示例(导致请求线程阻塞) @GetMapping("/delay") public String badExample() throws InterruptedException { Thread.sleep(5000); // 导致Tomcat线程被占用 return "结果"; } // ✅ 正确改进(使用异步响应) @GetMapping("/async-delay") public CompletableFuture<String> goodExample() { return CompletableFuture.supplyAsync(() -> { try { Thread.sleep(5000); } catch (InterruptedException e) { /* 处理异常 */ } return "异步结果"; }); } ``` 2. **精确延时控制技巧** ```java // 使用System.nanoTime()提升精度 long deadline = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(500); while (System.nanoTime() < deadline) { // 精确循环等待(适用于高精度需求) } ``` 3. **中断处理规范** ```java try { Thread.sleep(1000); } catch (InterruptedException e) { // 恢复中断状态(要!) Thread.currentThread().interrupt(); // 执行清理操作 } ``` --- ### 常见误区查 1. **Spring定时器的伪同步** ```java @Scheduled(fixedDelay = 5000) public void scheduledTask() { // 实际是异步执行,多个任务会队 } ``` 2. **Lambda中的阻塞陷阱** ```java CompletableFuture.runAsync(() -> { Thread.sleep(3000); // 仍会阻塞ForkJoinPool线程! }); ``` 3. **虚拟线程优化(JDK21+)** ```java Thread.ofVirtual().start(() -> { try { Thread.sleep(1000); // 不占用OS线程资源 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); ``` --- 根据实际需求选择方案: - **简单控制流程** → `Thread.sleep()` - **精确同步协调** → `CountDownLatch` - **资源敏感场景** → 避免忙等待 - **现代并发模型** → 优先考虑虚拟线程(Loom项目)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值