请教各位佬一个多线程问题

好的 佬 ,我试一下 :grinning:

线程池可以交给spring管理。每次方法调用都新建线程池,会消耗大量资源。
使用inputStream.skip()并不可靠,高并发情况下会导致大量磁盘io操作。建议对文件做分割为小文件,投入queue,upload线程池只需要关注queue,读取文件上传。
ArrayList不是线程安全,建议转为线程安全的版本。

1 Like

对头,我们s3就是这么弄得。后端给签名链接,前端上传

佬 转成图片再回复, 不能直接贴ai

多线程读同一个文件,太牛了吧。单个线程读文件绝对足够,你应该先读取数据然后再多线程提交。网络IO才是主要限制。

没有多线程读吧,多线程里面是提交操作

你在run方法里用FileInputStream就是多线程读

InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(...)
长到离谱的变量定义,太经典了,这就是为什么我讨厌java :joy:

1 Like

Java现在可以使用var了,并没多长

1 Like

直接贴AI回答会被人举报,一举一个准,论坛守则里的规定

我就被人举报过 :nauseated_face:

你这思路,不出问题才怪。

写这种流程很长的业务,首先用注释把流程图写出来。你这半点注释都没有,出问题才是正常的。

注释写完后,才开始给注释进行实现。期间一定要注意在变量发生改变时,以及进入一个步骤时,进行 log,用于在线 debug。

最后,建议用切片 sdk 进行上传,阿里有例子:

根据以上思路,你再试试,应该能解决。

1 Like

你这个和直接获取全部文件一样了吧

综合佬友们的回答,一点建议:

  1. 使用了CPU核数*2的线程数去同时读取一个可能很大的文件。IO是挺耗时的,这里可以考虑优化一下逻辑,读一遍就够了,比如边读边分发任务。

2.文件上传并发线程数量也应该参考机器带宽进行配置。

3.await 会阻塞当前线程。如果该线程不应该堵塞,那可以将这个任务放到新线程里运行。

4.考虑异步编程,使用 Vertx 等工具,打开新世界大门。 :clown_face: