创建一个线程池,有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() 关闭线程池,以确保所有线程执行完当前任务后停止。
注意:本文归作者所有,未经作者允许,不得转载