在ExecutorService.execute

时间:2019-05-17 00:14:56

标签: java multithreading java-8 executorservice

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)

0 个答案:

没有答案