java线程池执行任务(一次任务、固定间隔时间任务等)

简介: java线程池执行任务(一次任务、固定间隔时间任务等)

在 Java 中,可以使用线程池来执行定时任务。线程池是一种管理和复用线程的机制,它可以提高线程的利用率,减少线程创建和销毁的开销,并且可以控制并发线程的数量。

Java 中的定时任务可以使用 ScheduledThreadPoolExecutor 类来实现,它是 ThreadPoolExecutor 类的子类,专门用于执行定时任务。通过 ScheduledThreadPoolExecutor,可以按照指定的延迟时间或固定的时间间隔来执行任务。

下面是一个使用线程池执行定时任务的示例代码:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledThreadPoolExample {
    public static void main(String[] args) throws InterruptedException {
        // 创建一个大小为 5 的线程池
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);

        // 延迟 1 秒后执行任务
        executor.schedule(new Task(), 1, TimeUnit.SECONDS);

        // 延迟 2 秒后开始执行任务,然后每隔 3 秒重复执行任务
        executor.scheduleAtFixedRate(new Task2(), 2, 3, TimeUnit.SECONDS);

        // 延迟 2 秒后开始执行任务,然后在上一次任务执行完成后,等待 3 秒再执行下一次任务
        executor.scheduleWithFixedDelay(new Task3(), 2, 3, TimeUnit.SECONDS);
        Thread.sleep(100*1000);
        // 关闭线程池
        executor.shutdown();
    }

    static class Task implements Runnable {
        @Override
        public void run() {
            System.out.println("延迟一秒执行 " + System.currentTimeMillis());
        }
    }
    static class Task2 implements Runnable {
        @Override
        public void run() {
            System.out.println("延迟 2 秒后开始执行任务,然后每隔 3 秒重复执行任务 " + System.currentTimeMillis());
        }
    }
    static class Task3 implements Runnable {
        @Override
        public void run() {
            System.out.println("延迟 2 秒后开始执行任务,然后在上一次任务执行完成后,等待 3 秒再执行下一次任务 " + System.currentTimeMillis());
        }
    }
}

首先,我们创建了一个大小为 5 的线程池 executor,它使用 Executors.newScheduledThreadPool() 方法来创建。然后,我们使用 schedule() 方法调度了一个延迟 1 秒后执行的任务,该任务由 Task 类的实例执行。接着,我们使用 scheduleAtFixedRate() 方法调度了一个延迟 2 秒后开始执行的任务,并且每隔 3 秒重复执行一次,该任务由 Task2 类的实例执行。最后,我们使用 scheduleWithFixedDelay() 方法调度了一个延迟 2 秒后开始执行的任务,并且在上一次任务执行完成后,等待 3 秒再执行下一次任务,该任务由 Task3 类的实例执行。


在每个任务的 run() 方法中,我们输出了相应任务的执行时间戳。


为了保证定时任务的执行时间足够长,我们使用 Thread.sleep(100*1000) 方法让主线程休眠 100 秒。


最后,我们调用 executor.shutdown() 方法关闭线程池。


执行上述代码后,将会输出类似以下结果:

延迟一秒执行 1634736445744
延迟 2 秒后开始执行任务,然后每隔 3 秒重复执行任务 1634736448747
延迟 2 秒后开始执行任务,然后在上一次任务执行完成后,等待 3 秒再执行下一次任务 1634736451747

通过以上代码,我们实现了使用线程池执行定时任务,并且按照指定的延迟时间或固定的时间间隔来执行任务。

相关文章
|
2月前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
3月前
|
数据采集 缓存 Java
Python vs Java:爬虫任务中的效率比较
Python vs Java:爬虫任务中的效率比较
|
5天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
44 17
|
2月前
|
存储 Java 数据库
如何处理线程池关闭时未完成的任务?
总之,处理线程池关闭时未完成的任务需要综合考虑多种因素,并根据实际情况选择合适的处理方式。通过合理的处理,可以最大程度地减少任务丢失和数据不一致等问题,确保系统的稳定运行和业务的顺利开展。
135 64
|
2月前
|
消息中间件 监控 Java
线程池关闭时未完成的任务如何保证数据的一致性?
保证线程池关闭时未完成任务的数据一致性需要综合运用多种方法和机制。通过备份与恢复、事务管理、任务状态记录与恢复、数据同步与协调、错误处理与补偿、监控与预警等手段的结合,以及结合具体业务场景进行分析和制定策略,能够最大程度地确保数据的一致性,保障系统的稳定运行和业务的顺利开展。同时,不断地优化和改进这些方法和机制,也是提高系统性能和可靠性的重要途径。
127 62
|
2月前
|
Prometheus 监控 Cloud Native
JAVA线程池监控以及动态调整线程池
【10月更文挑战第22天】在 Java 中,线程池的监控和动态调整是非常重要的,它可以帮助我们更好地管理系统资源,提高应用的性能和稳定性。
212 64
|
1月前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
2月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
60 12
|
1月前
|
监控 Java 开发者
深入理解Java中的线程池实现原理及其性能优化####
本文旨在揭示Java中线程池的核心工作机制,通过剖析其背后的设计思想与实现细节,为读者提供一份详尽的线程池性能优化指南。不同于传统的技术教程,本文将采用一种互动式探索的方式,带领大家从理论到实践,逐步揭开线程池高效管理线程资源的奥秘。无论你是Java并发编程的初学者,还是寻求性能调优技巧的资深开发者,都能在本文中找到有价值的内容。 ####
|
2月前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
122 38