java中ScheduledExecutorService怎么实现

Java中ScheduledExecutorService的简介

ScheduledExecutorService是Java并发编程中的一个接口,它是ExecutorService接口的一个子接口,主要用于实现定时任务和周期性任务,与Executors.newSingleThreadExecutor()创建的单线程执行器不同,ScheduledExecutorService可以创建多线程执行器,支持定时任务和周期性任务的执行。

如何使用ScheduledExecutorService实现定时任务

1、创建ScheduledExecutorService实例

java中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()方法执行定时任务

java中ScheduledExecutorService怎么实现

使用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、如何取消已经安排好的定时任务?

java中ScheduledExecutorService怎么实现

答:可以使用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

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-01-02 02:25
Next 2024-01-02 02:27

相关推荐

  • java启动线程的几种方式

    Java启动线程的方式有:继承Thread类、实现Runnable接口、使用Callable和Future等。

    2024-01-19
    0126
  • tomcat性能调优方案

    Tomcat作为Java Web应用的常用服务器,其性能直接影响到网站的响应速度和用户体验,对Tomcat进行性能调优是每个Java开发者和运维人员必备的技能,本文将从多个方面深入探讨Tomcat性能调优的方法和实践,帮助大家更好地理解和掌握Tomcat的性能优化技巧。二、Tomcat性能调优的重要性随着互联网的发展,用户对于网站的性……

    2023-11-06
    0132
  • java怎么停止线程池中的线程运行

    Java线程池中的线程是管理线程的一种机制,可以有效地控制线程的数量和执行时间,当需要停止线程池中的线程时,我们需要谨慎处理,以避免出现不可预知的问题,本文将详细介绍如何停止Java线程池中的线程,并提供相关问题与解答的栏目。如何停止线程池中的线程?1、关闭线程池要停止线程池中的线程,首先需要关闭线程池,可以通过调用线程池的shutd……

    2024-01-04
    093
  • 高效稳定的多线程服务器实现技巧 (多线程服务器)

    使用线程池管理线程,避免频繁创建和销毁;采用锁机制保证数据安全;合理分配任务,避免线程饥饿。

    2024-03-19
    0152
  • java任务调度框架怎么使用

    Java任务调度框架有很多,其中比较常用的是Quartz。Quartz是一款Java开源任务调度框架,也是很多Java工程师接触任务调度的起点。它的作用其实类似于Java中的 Timer 定时器以及JUC中的 ScheduledExecutorService 调度线程池,当然Quartz作为一个独立的任务调度框架无疑在这方面表现的更为出色,功能更强大,能够定义更加复杂的任务调度规则 。

    2024-01-05
    0112
  • weblogic占用内存过高

    Weblogic内存占用过高,需优化配置或检查代码以降低资源消耗。

    2024-01-18
    0272

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入