gpt4 book ai didi

java - ConcurrentHashMap 消除线程问题

转载 作者:太空宇宙 更新时间:2023-11-04 09:24:35 26 4
gpt4 key购买 nike

我现在正在使用 Java ConcurrentHashMap 做一些事情。我在多线程环境中遇到一些问题。

我的代码是:1. 将Runnable对象添加到ConcurrentHashMap中。

private Map<String, ScheduledFuture<?>> scheduledTasks = new ConcurrentHashMap<>();
Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
AA();
}
};
ScheduledFuture<?> task = taskScheduler.scheduleAtFixedRate(runnable, 10);
scheduledTasks.put(taskId, task);
  • 将 Runnable 对象移除到 ConcurrentHashMap。
  •     if (scheduledTasks.get(taskId) != null && !"".equals(scheduledTasks.get(taskId))
    {
    scheduledTasks.get(taskId).cancel(true);
    scheduledTasks.get(taskId).remove();
    }

    仅添加或删除不会导致问题,如果我将 scheduledTasks.keySet() 打印到控制台或日志文件,它会打印正确的结果。

    但是,问题是,从 Map 中删除可运行对象后,某些可运行对象仍在运行(即使 Map 不再具有该可运行对象!)。

    我真的不知道问题出在哪里。是我对“Java多线程环境”的理解不够吗?或者...这个问题是关于 ScheduledFuture 的?

    最佳答案

    您也可以通过以下方式完成:

    ExecutorService exe = Executors.newFixedThreadPool(10);
    CountDownLatch taskLatch = new CountDownLatch(10);
    List<Callable Interface Instance> loadingTasks = new ArrayList<Callable Interface Instance>();
    //create instance of Callable Interface Instance
    loadingTasks.add(task);// where task will be Callable Interface Instance/reference name

    List<Future<Boolean>> futures = exe.invokeAll(loadingTasks);
    boolean complete = taskLatch.await(5, TimeUnit.MINUTES); //waiting for tasks to be completed

    for (Future<Boolean> f : futures) {
    taskComplete = f.get(); //get callable interface instance call method return value
    }

    关于java - ConcurrentHashMap 消除线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57881066/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com