我有循环,我在哪里下载图像,我需要加载例如 10 个图像并将它们合并到一个图像中。在我的兴趣中,将加载哪些图像。我就是这样做的。我有executor
限制线程数,并且我有CountDownLatch
障碍等待所有图像被加载。
CountDownLatch barrier = new CountDownLatch(images.size());
private static ExecutorService executorService = Executors.newFixedThreadPool(MAX_THREAD_POOL);
for (Image image : images) {
executorService.execute(new ImageRunnable(image, barrier));
}
barrier.await();
在ImageRunnable
我下载这样的图像。来自谷歌静态地图。
String url ="my url"
try {
URL target = new URL(url);
ImageIO.read(target);
barrier.countDown();
//exaggerated logic
} catch (IOException e) {
System.out.println("Can not load image, " + e);
}
其他人对我说,当所有线程executor
都忙并且我的算法永远不会结束时,我会遇到这种情况,因为他会等到所有线程都得到barrier.await()
点(死锁)。如何对我说它会在ImageIO.read(target)
调用时发生并且连接将建立但 HTTP 会话永远不会关闭(来自服务器的响应不回来)。这会发生吗?我认为在这种情况下我会遇到一些异常并且坏线程会被中断。正是在我开始循环时发生了这种情况,但在第三张图像上,我通过防火墙关闭了互联网连接。在输出时,我得到损坏的图像,例如网络已关闭并且图像未加载到结束。我错了吗?