异步for循环无挂起

the*_*sti 6 java multithreading loops asynchronous

我写了一个同步 for 循环,如下所示:

for (Map.Entry<String, CustomClass> entry : assocs.entrySet()) {
  String key = entry.getKey();
  CustomClass value = entry.getValue();
  value.tick(key);
}
Run Code Online (Sandbox Code Playgroud)

问题是有时(很少).tick挂起。如果单个.tick,没什么大不了的,它会在一段时间后自行修复,并且实际上根本不重要(这是由于客户端的互联网速度较慢)。但如果耽误了其他人的话那就有问题了。

所以我希望每个循环体都能运行,而无需等待其他循环体完成。

And*_*ert 2

老实说,创建​​ ExecutorService 比手动管理自己的线程要简单:

final ExecutorService exec = Executors.newFixedThreadPool(10);

//create a list of Futures, so you know when each tick is done
final List<Future> futures = new ArrayList<>();
for (final Map.Entry<String, CustomClass> entry : assocs.entrySet()) {
  final Future<?> future = exec.submit(new Runnable() {
    public void run() {
      String key = entry.getKey();
      CustomClass value = entry.getValue();
      value.tick(key);
    }
  });
  futures.add(future);
}

// wait for each future to complete before moving on
for (final Future<?> future : futures) {
  try {
    future.get();
  } catch (Execption e) {
    e.printStackTrace();
  }
}
Run Code Online (Sandbox Code Playgroud)

强烈建议您以多线程和单线程方式运行代码。除非value.tick需要长时间,否则在一个线程中执行此操作可能会更快;每当运行多线程代码时,Java 就必须执行大量无形的开销工作,以确保不会以不一致的方式访问内存。