java创建线程池,分别执行各自的定时任务,可以随时修改cron表达式Demo

轩辕暗神 1年前 ⋅ 513 阅读

创建一个线程池,有10个定时任务线程,每个线程做不同的任务,我可以随时根据我的条件关闭指定的线程,再重新设定cron表达式后再启动该线程

以下是使用 Java 编写的示例代码,演示如何创建一个具有 10 个定时任务线程的线程池,并通过条件关闭和重新设定 cron 表达式后重新启动线程:

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

public class ScheduledThreadPoolDemo {
    private static ScheduledExecutorService executor;

    public static void main(String[] args) {
        // 创建具有 10 个线程的定时任务线程池
        executor = Executors.newScheduledThreadPool(10);

        // 启动定时任务线程
        startTask(1, "*/5 * * * * *"); // 每 5 秒执行一次任务 1
        startTask(2, "0 */1 * * * *"); // 每分钟执行一次任务 2
        startTask(3, "0 0 */2 * * *"); // 每两小时执行一次任务 3

        // 模拟等待一段时间后关闭指定的线程
        try {
            Thread.sleep(10000); // 等待 10 秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 关闭指定的线程
        stopTask(2); // 停止任务 2

        // 模拟等待一段时间后重新设定 cron 表达式并启动线程
        try {
            Thread.sleep(5000); // 等待 5 秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 重新设定 cron 表达式并启动线程
        resetAndStartTask(2, "0 */2 * * * *"); // 修改任务 2 的 cron 表达式为每两分钟执行一次

        // 关闭线程池
        executor.shutdown();
    }

    // 启动定时任务线程
    private static void startTask(int taskId, String cronExpression) {
        Runnable task = () -> {
            System.out.println("Task " + taskId + " is running");
            // 执行具体的任务逻辑
        };

        // 使用 schedule 方法设定定时任务
        executor.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);

        // 使用 scheduleWithFixedDelay 方法设定定时任务
        // executor.scheduleWithFixedDelay(task, 0, 1, TimeUnit.SECONDS);
    }

    // 停止指定的线程
    private static void stopTask(int taskId) {
        executor.shutdown(); // 关闭线程池,停止所有线程的执行
        System.out.println("Task " + taskId + " is stopped");
    }

    // 重新设定 cron 表达式并启动线程
    private static void resetAndStartTask(int taskId, String cronExpression) {
        Runnable task = () -> {
            System.out.println("Task " + taskId + " is running with new cron expression");
            // 执行具体的任务逻辑
        };

        // 取消当前任务的执行
        executor.shutdown();

        // 创建新的线程池
        executor = Executors.newScheduledThreadPool(10);

        // 使用 schedule 方法设定新的定时任务
        executor.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);

        // 使用 scheduleWithFixedDelay 方法设定新的定时任务
        // executor.scheduleWithFixedDelay(task, 0, 1, TimeUnit.SECONDS);
    }
}

在示例代码中,我们使用 Executors.newScheduledThreadPool(10) 创建了一个具有 10 个定时任务线程的线程池。通过 startTask 方法启动了 3 个定时任务,每个任务根据指定的 cron 表达式执行。

在模拟等待一段时间后,我们调用 stopTask 方法关闭指定的线程,停止任务的执行。

接着,我们调用 resetAndStartTask 方法重新设定 cron 表达式并启动线程。在该方法中,我们先调用 executor.shutdown() 关闭当前的线程池,然后创建一个新的线程池。最后,使用 scheduleAtFixedRate 或 scheduleWithFixedDelay 方法设定新的定时任务,并启动线程。

请注意,在示例代码中,我们使用了 scheduleAtFixedRate 和 scheduleWithFixedDelay 方法来设定定时任务。你可以根据实际需求选择适合的方法。

最后,我们调用 executor.shutdown() 关闭线程池,以确保所有线程执行完当前任务后停止。


全部评论: 0

    我有话说: