要避免重复提交任务,可以使用一个Set集合来保存已经提交的任务的唯一标识。在每次提交任务之前,先判断该任务的唯一标识是否已经存在于集合中,如果存在则不再提交任务。

以下是一个示例代码:

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

public class TaskScheduler {
    private Set<String> submittedTasks;
    private ScheduledExecutorService executorService;

    public TaskScheduler() {
        submittedTasks = ConcurrentHashMap.newKeySet();
        executorService = Executors.newScheduledThreadPool(1);
    }

    public void scheduleTask(Runnable task, String taskId, long delay, TimeUnit unit) {
        if (!submittedTasks.contains(taskId)) {
            submittedTasks.add(taskId);
            executorService.schedule(task, delay, unit);
        }
    }

    public void shutdown() {
        executorService.shutdown();
    }

    public static void main(String[] args) {
        TaskScheduler scheduler = new TaskScheduler();

        Runnable task1 = () -> System.out.println("Task 1 executed");
        Runnable task2 = () -> System.out.println("Task 2 executed");

        scheduler.scheduleTask(task1, "task1", 1, TimeUnit.SECONDS);
        scheduler.scheduleTask(task2, "task2", 2, TimeUnit.SECONDS);
        scheduler.scheduleTask(task1, "task1", 3, TimeUnit.SECONDS); // 不会重复提交

        scheduler.shutdown();
    }
}

在上面的示例中,TaskScheduler类使用ConcurrentHashMap.newKeySet()创建了一个线程安全的Set集合来保存已经提交的任务的唯一标识。在scheduleTask方法中,首先判断该任务的唯一标识是否已经存在于集合中,如果不存在则将该任务的唯一标识添加到集合中,并提交任务到ScheduledExecutorService中。

main方法中,我们创建了两个任务task1task2,并使用不同的唯一标识调用了scheduleTask方法。其中,第一次调用scheduleTask方法会提交任务task1,第二次调用scheduleTask方法会提交任务task2,第三次调用scheduleTask方法由于唯一标识为task1已经存在于集合中,所以不会重复提交任务。

最后,记得在不需要使用ScheduledExecutorService时调用shutdown方法来关闭线程池。

java ScheduledExecutorService 设置任务唯一标识 如何避免重复提交

原文地址: http://www.cveoy.top/t/topic/imJK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录