scheduleAtFixedRate创建及关闭
时间: 2023-11-24 07:48:44 浏览: 67
java定时器.pdf
scheduleAtFixedRate是ScheduledExecutorService接口中的一个方法,用于创建一个周期性执行的定时任务。该方法需要传入一个Runnable对象作为任务,以及一个初始延迟时间和一个周期时间,表示任务的第一次执行时间和每次执行的时间间隔。例如,下面的代码创建了一个每隔1秒钟执行一次的定时任务:
```
ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
pool.scheduleAtFixedRate(() -> {
// 任务代码
}, 0, 1, TimeUnit.SECONDS);
```
在上面的代码中,我们使用Executors工厂类创建了一个ScheduledExecutorService对象,然后调用scheduleAtFixedRate方法创建了一个定时任务。任务代码可以放在Lambda表达式中,也可以单独定义一个实现了Runnable接口的类。第二个参数0表示任务的初始延迟时间为0秒,第三个参数1表示任务的周期时间为1秒。
当我们需要关闭ScheduledExecutorService时,可以使用shutdown方法来关闭线程池,但是该方法只是发送一个关闭信号,并不会立即停止线程池中正在执行的任务。如果我们需要立即停止线程池中的任务,可以使用shutdownNow方法。该方法会尝试停止所有正在执行的任务,并返回一个List<Runnable>对象,其中包含了所有未执行的任务。例如,下面的代码创建了一个ScheduledThreadPoolExecutor对象,然后在12秒后关闭线程池:
```
ScheduledThreadPoolExecutor pool = new ScheduledThreadPoolExecutor(1);
pool.scheduleAtFixedRate(() -> {
// 任务代码
}, 0, 3, TimeUnit.SECONDS);
new Thread(() -> {
try {
Thread.sleep(12000);
List<Runnable> tasks = pool.shutdownNow();
System.out.println("未执行的任务数:" + tasks.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
```
在上面的代码中,我们使用ScheduledThreadPoolExecutor类创建了一个线程池,并使用scheduleAtFixedRate方法创建了一个每隔3秒钟执行一次的定时任务。然后我们另起一个线程,在12秒后调用shutdownNow方法关闭线程池,并输出未执行的任务数。注意,shutdownNow方法会抛出InterruptedException异常,需要进行处理。
阅读全文