画像をダウンロードするサイクルがあります。たとえば、10枚の画像を読み込んで、1つの画像にマージする必要があります。私の興味では、どの画像がすべてロードされますか。これが私がそれをする方法です。スレッド数を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セッションが閉じられることはありません(サーバーからの応答が返されません)。これは起こり得ますか?この場合、いくつかの例外が発生し、不良スレッドが中断されると思いました。まさにそれは私がサイクルを開始したときに起こりますが、3番目の画像でファイアウォールによるインターネット接続を閉じます。出力時に、ネットワークが閉じられ、画像が最後まで読み込まれなかったように、画像が壊れます。私が間違っている?