Выполнить несколько задач в ExecutorService.execute - PullRequest
0 голосов
/ 17 мая 2019
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)

...