Java中ScheduledExecutorService的简介
ScheduledExecutorService
是Java并发编程中的一个接口,它是ExecutorService
接口的一个子接口,主要用于实现定时任务和周期性任务,与Executors.newSingleThreadExecutor()
创建的单线程执行器不同,ScheduledExecutorService
可以创建多线程执行器,支持定时任务和周期性任务的执行。
如何使用ScheduledExecutorService实现定时任务
1、创建ScheduledExecutorService实例
我们需要创建一个ScheduledExecutorService
实例,可以使用Executors.newScheduledThreadPool()
方法创建一个具有固定线程数量的线程池,或者使用Executors.newScheduledThreadPool()
方法创建一个无界线程池。
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledExecutorServiceDemo { public static void main(String[] args) throws InterruptedException { // 创建一个固定线程数量的线程池 ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2); // 或者创建一个无界线程池 // ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(0); } }
2、实现Runnable接口的任务类
接下来,我们需要创建一个实现Runnable
接口的任务类,在run()
方法中编写需要执行的任务逻辑。
class MyTask implements Runnable { @Override public void run() { System.out.println("Hello, ScheduledExecutorService!"); } }
3、使用scheduleAtFixedRate()方法执行定时任务
使用scheduleAtFixedRate()
方法可以按照指定的时间间隔执行任务,该方法接收四个参数:任务实例、首次执行的延迟时间、连续执行之间的时间间隔以及时间单位。
import java.util.concurrent.TimeUnit; public class ScheduledExecutorServiceDemo { public static void main(String[] args) throws InterruptedException { ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2); MyTask myTask = new MyTask(); scheduledExecutorService.scheduleAtFixedRate(myTask, 0, 5, TimeUnit.SECONDS); // 为了演示效果,让主线程休眠10秒后关闭线程池 Thread.sleep(10000); scheduledExecutorService.shutdown(); } }
4、使用scheduleWithFixedDelay()方法执行周期性任务
使用scheduleWithFixedDelay()
方法可以按照指定的时间间隔执行周期性任务,该方法接收三个参数:任务实例、首次执行的延迟时间以及连续执行之间的时间间隔,需要注意的是,这个方法会比scheduleAtFixedRate()
多一次任务执行。
import java.util.concurrent.TimeUnit; public class ScheduledExecutorServiceDemo { public static void main(String[] args) throws InterruptedException { ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2); MyTask myTask = new MyTask(); scheduledExecutorService.scheduleWithFixedDelay(myTask, 0, 5, TimeUnit.SECONDS); // 为了演示效果,让主线程休眠10秒后关闭线程池 Thread.sleep(10000); scheduledExecutorService.shutdown(); } }
相关问题与解答
1、如何取消已经安排好的定时任务?
答:可以使用ScheduledFuture<?>
接口的cancel()
方法取消已经安排好的定时任务,如果任务已经开始执行,那么取消操作可能会失败,为了避免这种情况,可以在调用cancel()
方法时传入一个可取消标志,表示是否允许取消正在执行的任务。
if (scheduledFuture != null && scheduledFuture.isCancelled()) { return; // 如果任务已经被取消,直接返回,不继续执行后续操作。 } else if (scheduledFuture != null && scheduledFuture.isDone()) { // 如果任务已经完成或被取消,直接返回,否则尝试取消任务。 if (!scheduledFuture.cancel(true)) { // 如果取消失败,记录日志并返回,否则继续执行后续操作。 System.out.println("Failed to cancel the task"); } else { // 如果取消成功,记录日志并继续执行后续操作,关闭线程池等。 System.out.println("Successfully cancelled the task"); } } else if (scheduledFuture == null) { // 如果没有找到对应的任务实例,直接返回,检查传入的任务实例是否为null等。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/190026.html