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会返回一个文件ID,并根据该文件ID从临时位置中删除该文件。我想知道我的代码是否保证它将删除所有上传到FTP的图像?或者是否有可能由于多个线程而跳过某些线程?
更新1:
我对此进行了超过30000张图片的测试,但没有图片上传。以下是例外情况:
“ JMX监视器线程组执行程序池[Thread-2181]” ID = 32712 守护程序prio = 5 TIMED_WAITING lock=java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@4b3f18ab 封锁(cnt):0;等待(cnt):1 CPU nanos:0;用户nanos:0;分配的字节数:位于sun.misc.Unsafe.park(本机方法)处的568 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) 在java.lang.Thread.run(Thread.java:748)