如果不用schedule 用的是scheduleAtFixedRate 我仍要cancel失败 给出demo
时间: 2023-08-26 18:15:04 浏览: 83
java中timer的schedule和scheduleAtFixedRate方法区别详解
5星 · 资源好评率100%
好的,下面是一个使用 `scheduleAtFixedRate` 方法并且取消任务失败的示例代码:
```
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws InterruptedException {
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
// 在5秒后开始执行任务,每隔2秒钟执行一次
executor.scheduleAtFixedRate(() -> {
System.out.println("Task executed");
}, 5, 2, TimeUnit.SECONDS);
// 等待10秒钟
Thread.sleep(10000);
// 尝试取消任务
boolean cancelled = executor.cancel(true);
System.out.println(cancelled ? "Task has been cancelled" : "Task could not be cancelled");
// 关闭线程池
executor.shutdown();
}
}
```
这段代码使用 `scheduleAtFixedRate` 方法安排了一个任务,它会在 5 秒后开始执行,然后每隔 2 秒钟执行一次。接着,代码使用 `Thread.sleep()` 方法让当前线程等待 10 秒钟,然后调用 `executor.cancel()` 方法来取消任务,参数 true 表示中断正在执行的任务。然而,由于 `scheduleAtFixedRate` 方法安排的任务是周期性执行的,因此在任务开始执行后,在下一次任务被安排并执行之前,线程不会进入等待状态,也就是说,调用 `cancel()` 方法并不能立即取消正在执行的任务。因此,上面的代码在调用 `cancel()` 方法后输出的结果是 "Task could not be cancelled",表示任务无法被取消。最后,代码使用 `executor.shutdown()` 方法关闭线程池。
阅读全文