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多任务编排技术
JDK 5引入Future接口实现异步任务处理,但获取结果不够灵活。Java 8新增CompletableFuture,实现异步任务编排,支持流式处理、多任务组合及异常处理,提升执行效率与代码可读性,简化并发编程复杂度。
|
3月前
|
人工智能 Java Go
java判断ExecutorService是否有任务
在Java中,ExecutorService用于管理线程池。本文介绍如何判断ExecutorService是否有任务正在执行或等待执行。通过创建固定大小的线程池、提交任务,并使用`awaitTermination()`方法结合超时时间,可以有效检测任务状态。此方法简单实用,适用于多种场景。文末附有代码示例及详细解读。
|
4月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
188 0
|
7月前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
353 60
【Java并发】【线程池】带你从0-1入门线程池
|
10月前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
258 2
|
6月前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
282 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
|
10月前
|
存储 Java 数据库
如何处理线程池关闭时未完成的任务?
总之,处理线程池关闭时未完成的任务需要综合考虑多种因素,并根据实际情况选择合适的处理方式。通过合理的处理,可以最大程度地减少任务丢失和数据不一致等问题,确保系统的稳定运行和业务的顺利开展。
450 64
|
10月前
|
消息中间件 监控 Java
线程池关闭时未完成的任务如何保证数据的一致性?
保证线程池关闭时未完成任务的数据一致性需要综合运用多种方法和机制。通过备份与恢复、事务管理、任务状态记录与恢复、数据同步与协调、错误处理与补偿、监控与预警等手段的结合,以及结合具体业务场景进行分析和制定策略,能够最大程度地确保数据的一致性,保障系统的稳定运行和业务的顺利开展。同时,不断地优化和改进这些方法和机制,也是提高系统性能和可靠性的重要途径。
279 62
|
8月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
333 17
|
7月前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
349 0