多文件上传到FTP遇到的线程并发问题

3 篇文章 0 订阅
3 篇文章 1 订阅

问题发生的直观描述:在用户用Bootstarp Fileinput通过异步的方式上传多张图片文件至ftp时出现文件有的成功,有的失败。完全随机的。

debug结论:在FtpClient.storeFile()时报connect is not open 的IO异常有的还有connect closed when copying.

出现的原因:Fileinput会同时请求后端的upload接口,然而FtpUtil里面将FtpClient和上传的方法全都写成static了,可能是当时为了方便直接调方法 而不用new对象。这样又节约内存?这时就发生了并发情况下出现的一系列问题。

解决办法:1将上传文件的方法加synchronized。最简单的但肯定不好的

                2将static全部改成非静态的。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,关于java线程池多线程上传文件,我可以给您提供一些思路和代码示例。 首先,我们可以利用Java中的Executor框架来创建线程池,方便管理和控制线程的数量。然后,我们可以使用Java中的多线程编程技术来实现文件上传并发操作。 以下是一个简单的示例代码,可以上传指定目录下的所有文件,并利用线程池中的线程来进行并发上传操作: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class FileUploader { private final ExecutorService executorService; public FileUploader(int numThreads) { executorService = Executors.newFixedThreadPool(numThreads); } public void uploadFiles(String directoryPath, String serverUrl) { File directory = new File(directoryPath); if (!directory.isDirectory()) { System.out.println("Invalid directory path!"); return; } File[] files = directory.listFiles(); for (File file : files) { executorService.submit(new FileUploadTask(file, serverUrl)); } } private static class FileUploadTask implements Runnable { private final File file; private final String serverUrl; public FileUploadTask(File file, String serverUrl) { this.file = file; this.serverUrl = serverUrl; } @Override public void run() { try (FileInputStream inputStream = new FileInputStream(file)) { // TODO: Upload file to server using HTTP or FTP protocol System.out.println("File " + file.getName() + " uploaded successfully!"); } catch (IOException e) { System.out.println("Failed to upload file " + file.getName() + ": " + e.getMessage()); } } } } ``` 在上述代码中,我们首先创建了一个FileUploader类,并在构造方法中初始化了一个线程池。然后,我们定义了一个uploadFiles方法,该方法接收一个目录路径和服务器URL作为参数,遍历指定目录下的所有文件,并利用线程池中的线程来上传文件。 在FileUploadTask类中,我们实现了Runnable接口,并在run方法中定义了文件上传的逻辑。在实际应用中,我们可以根据具体需求来选择合适的上传协议和实现方式。 希望这个示例能够对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值