List<String> filePaths = new ArrayList<String>();
// add the files in the list based on some logic.
ExecutorService threadPool = Executors.newFixedThreadPool(numberOfThreads);
for (String file : filePaths) {
threadPool.execute(() -> {
logImg.info(" ::::: " + Paths.get(file).getFileName());
String boxFileId = UploadFile.uploadToBox(file, location);
try {
if (!boxFileId.isEmpty()){
Files.delete(Paths.get(file));
}
} catch (Exception e) {
e.printStackTrace();
}
});
}
threadPool.shutdown();
threadPool.awaitTermination(2, TimeUnit.HOURS);
Список filePaths содержит несколько файлов. Сначала я регистрирую файлы, затем загружаю их на FTP-сервер, а затем окончательно удаляю их из временного местоположения (откуда оно загружено на FTP-сервер).
Когда я первоначально запустил этот код, у меня возникли проблемы с тупиком. После этого я запускал один и тот же код 2-3 раза, и он работал нормально. Количество загруженных изображений на FTP было таким же, как и количество записанных изображений.
В принципе, какие бы файлы он ни загружал на FTP, я хочу зарегистрировать их, а затем удалить из временного местоположения.
Загрузка на FTP возвращает fileId, и на основе этого fileId мы удаляем из временного местоположения. Я хочу знать, дает ли мой код гарантию, что он удалит все изображения, загруженные на FTP? Или, если есть вероятность, что он может пропустить некоторые из-за нескольких потоков?
Обновление 1:
Я протестировал более 30000 изображений, и ни одно из изображений не было загружено. Следующее исключение:
"Пул исполнителя группы потоков JMX Monitor [Thread-2181]" Id = 32712
демон prio = 5 TIMED_WAITING включен
lock=java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@4b3f18ab
Заблокировано (cnt): 0; Ожидал (cnt): 1
Нанос процессора: 0; Нанос пользователя: 0; Распределено байтов: 568 в sun.misc.Unsafe.park (собственный метод) в
java.util.concurrent.locks.LockSupport.parkNanos (LockSupport.java:215)
в
java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.awaitNanos (AbstractQueuedSynchronizer.java:2078)
в
java.util.concurrent.LinkedBlockingQueue.poll (LinkedBlockingQueue.java:467)
в
java.util.concurrent.ThreadPoolExecutor.getTask (ThreadPoolExecutor.java:1073)
в
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1134)
в
java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624)
at java.lang.Thread.run (Thread.java:748)