前面写的一个小功能,上传文件到服务器,结束上传时由于要销毁线程,又是由于等待时间偶尔过长会造成主界面卡顿问题,想着优化一下,采用线程复用的思路
第一版优化思路:
1、拿到所有需要上传的文件信息后,按并发数创建文件读取线程【读取完成变量】,读取到的数据块保留在线程中
2、上传类从线程中获取对应的文件块,并上传对应的文件块
3、文件读取完成后。如果还有读取任务,接受新的任务【1.会造成未上传完的文件块丢失,导致上传失败 2.读取完成变量被置为false,导致上传失败】
4、如果没有读取任务,关闭线程【同样,3中的问题更加凸出,而且由于线程已销毁,获取时还有很大可能导致程序崩溃】
第二版思路
1、拿到所有需要上传的文件信息后,按并发数创建文件读取线程【读取完成变量】,读取到的数据块保留在线程中
2、上传类,将保存数据块的容器地址传给读取线程,将读取到的文件块直接给上传类
3、文件读取完成后。如果还有读取任务,接受新的任务
4、如果没有读取任务,关闭线程【由于线程已销毁,读取完成变量变为垃圾值,导致再次上传时判断为读取失败,导致上传失败】
重新整理第二版思路
1、拿到所有需要上传的文件信息后,按并发数创建文件读取线程
2、上传类,将保存数据块的容器地址传给读取线程,将读取到的文件块直接给上传类
3、文件读取完成后。判断文件是否读取完毕,当前上传文件是否上传完成,如果没有上传完成不接新的任务,如果上传完成,判断是否还有读取任务,接受新的任务
4、如果没有读取任务,关闭线程
最后总结:
1、线程复用时,数据一定不要存放在线程中,任务委托类自己存放,避免接受新任务或销毁线程时导致的无法获取到数据。
2、线程复用并判断是否可以接受新任务时,一定要考虑任务委托类中是否有和线程类中的状态判断,如果有一定要当相关判断脱钩后再接取新任务。