当我们需要在Java应用程序中执行定时任务时,可以使用ScheduledExecutorService
。使用该工具可以轻松实现多线程执行任务,并使用线程池复用线程,从而减少资源的浪费和线程创建的时间。
下面是使用ScheduledExecutorService
实现任务调度的完整攻略:
步骤1:创建线程池
我们首先需要创建一个线程池。在实际应用中,为了避免线程创建和销毁的开销,一般会使用线程池来管理线程。使用以下代码创建一个定时调度线程池:
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
这里创建了一个含有两个线程的线程池,该线程池可以执行定时任务。
步骤2:创建定时任务
接下来,我们需要创建定时任务。使用以下代码创建一个定时任务:
Runnable task = () -> System.out.println("Hello World!");
ScheduledFuture<?> future = executorService.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);
这里使用了Lambda表达式来创建Runnable任务,该任务打印了一个Hello World!的信息。然后使用scheduleAtFixedRate
方法,在延迟0秒后,每隔1秒执行一次该任务。该方法返回一个ScheduledFuture
对象,该对象可以用来停止或者取消定时任务。
步骤3:停止定时任务
如果需要停止定时任务,可以通过调用ScheduledFuture
对象的cancel
方法来实现。例如,以下代码取消前面创建的定时任务:
future.cancel(true);
这将立即停止定时任务,线程池中的线程可以被重用。
示例1
以下代码演示了如何使用ScheduledExecutorService
来每隔1秒输出一个数字:
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
Runnable task = () -> {
for (int i = 1; i < 11; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
executorService.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);
这里创建了一个单线程的线程池,并使用scheduleAtFixedRate
方法每隔1秒输出一个数字,在数字输出结束后线程可以被重用。
示例2
以下代码演示了如何使用ScheduledExecutorService
来执行一个1秒的定时任务,之后停止该任务:
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
Runnable task = () -> {
System.out.println("Hello World!");
};
ScheduledFuture<?> future = executorService.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
future.cancel(true);
这里创建了一个单线程的线程池,并使用scheduleAtFixedRate
方法执行一个1秒的定时任务。在任务执行1秒后,使用ScheduledFuture
对象的cancel
方法停止该任务。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java多线程开发ScheduledExecutorService简化方式 - Python技术站