还有其他demo吗 不是while true的场景
时间: 2023-11-24 11:07:02 浏览: 84
Java实验-循环语句,for,while,do-while
5星 · 资源好评率100%
以下是一个使用`ScheduledExecutorService`执行定时任务,并且在任务执行过程中捕获`InterruptedException`异常并清除中断标志位的示例代码:
```java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class ScheduledTaskDemo {
public static void main(String[] args) throws InterruptedException {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
// 创建一个定时任务,每隔1秒输出一次当前时间戳
ScheduledFuture<?> future = executor.scheduleAtFixedRate(() -> {
try {
System.out.println(System.currentTimeMillis());
Thread.sleep(1000);
} catch (InterruptedException e) {
// 捕获并忽略InterruptedException异常,同时清除中断标志位
Thread.currentThread().interrupt();
}
}, 0, 1, TimeUnit.SECONDS);
// 等待5秒后中断任务
Thread.sleep(5000);
future.cancel(true);
// 关闭线程池
executor.shutdown();
}
}
```
在上面的代码中,我们同样使用`ScheduledExecutorService`线程池执行一个定时任务,该任务每隔1秒输出一次当前时间戳。与之前的例子不同的是,在任务的执行过程中,我们捕获了`InterruptedException`异常,并在异常处理代码中清除了中断标志位。这样,即使中断操作失败,任务也会在下一次循环开始时检查中断标志位并退出循环,从而达到中断任务的目的。
当我们在主线程中调用`future.cancel(true)`方法中断任务时,由于任务在捕获`InterruptedException`异常时清除了中断标志位,因此中断操作也会失败。但是,由于任务会在下一次循环开始时检查中断标志位并退出循环,因此任务仍会停止执行。
所以,无论任务的具体实现如何,我们都应该在任务的执行过程中检查中断标志位,以便及时响应中断操作。如果任务无法响应中断,那么中断操作可能会失败,从而导致任务无法停止。
阅读全文