【发布时间】:2020-08-31 20:47:04
【问题描述】:
我需要编写代码来处理一个 HashMap(两个不同的类是它的键和值)并为它的每个项目创建一个线程。要执行线程,代码将从该 HashMap 中获取一个条目并检查是否存在具有相同值的线程。如果存在,它将跳过该条目,直到该线程完成执行。代码必须经过这个HashMap,直到它为空,而不破坏我上面提到的条件。但是,我在实现这个逻辑时遇到了麻烦。
我根据处理器数量和正在执行的值列表(来自 HashMap)创建了一个执行器服务。但我不知道如何在线程完成运行后从该列表中删除该值。
这是我未完成和未经测试的代码:
int threads = Runtime.getRuntime().availableProcessors();
ExecutorService executor = Executors.newFixedThreadPool(threads);
List<Future<Boolean>> futures = new ArrayList<>();
List<UnidadeOrganizacionalView> dealershipsBeingExecuted = new ArrayList<>();
dealershipsBeingExecuted = Collections.synchronizedList(dealershipsBeingExecuted);
Iterator<Map.Entry<NotaResumoView, UnidadeOrganizacionalView>> it =
preparedNfs.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<NotaResumoView, UnidadeOrganizacionalView> pair = it.next();
if (dealershipsBeingExecuted.contains(pair.getValue())){
it.next();
}
dealershipsBeingExecuted.add(pair.getValue());
futures.add(executor.submit(
new ConfirmNfeProcessor(Integration, pair.getKey(), pair.getValue())););
it.remove();
}
【问题讨论】:
-
不要将您提交给
ExecutorService的对象称为“线程”。这些对象是任务。 ExecutorService 创建自己的线程,用于执行您提交给它的任务。 -
您应该有一个
Map<UnidadeOrganizacionalView,Future<Boolean>> pending,而不是List<Future<Boolean>> futures和List<UnidadeOrganizacionalView> dealershipsBeingExecuted,它允许您获取已经存在的任务并根据需要等待其完成。 -
Solomon Slow,谢谢指正,我有这种调用任务线程的习惯,可能是我对 Java 8 多任务处理缺乏了解所致。
-
不相关:在我完成评论之前,您删除了另一个问题。问题是:将您的复杂业务代码分解为一个小示例正是您通常调试此类问题的方式,无论是否在这里询问它们。这就是本质:你从一个简约的东西开始,然后你慢慢地添加更多,直到你“遇到”你的错误。如果仅此一项并不能让您知道出了什么问题,那么您可以在这里分享一些东西。其他任何事情都是浪费时间。
标签: java multithreading concurrency hashmap