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,没什么大不了的,它会在一段时间后自行修复,并且实际上根本不重要(这是由于客户端的互联网速度较慢)。但如果耽误了其他人的话那就有问题了。
所以我希望每个循环体都能运行,而无需等待其他循环体完成。
老实说,创建 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 就必须执行大量无形的开销工作,以确保不会以不一致的方式访问内存。
| 归档时间: |
|
| 查看次数: |
9295 次 |
| 最近记录: |