2021SC@SDUSC
目录
一、线程池的使用
由于本人负责的压缩文件处理第一个就涉及到Java线程池的问题,因此本次报告先围绕Java线程池即多线程问题展开。
之前大一学习java学到过多线程,而线程池是解决多线程的一个手段。
那么,什么是线程池?
在一个线程的生命周期内,往往线程创建和销毁的时间要大于线程执行的时间,所以频繁的创建线程会消耗额外的时间。如果等到有任务来了,在去创建线程的话效率就会比较低,如不把线程放在某个地方,任务来了,直接把线程拿过来用比较好;另外,线程池可以管理控制线程,使用线程池,可以进行统一分配,方便调优和监控。线程可以提供队列,存放缓冲等待执行的任务。
由此看来,线程池可以
- 降低资源消耗
- 提高响应速度
- 提高线程的可管理性
关于ExecutorService
ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent
包中。
private final ExecutorService executors = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
ExecutorService创建,newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
executors.submit(new ZipExtractorWorker(entriesToBeExtracted, zipFile, filePath));
submit(new Runnable)这个方法接收一个Runnable实例,并且异步的执行,上述代码端括号内的类继承自Runnable。
二、 多线程处理压缩文件
1.ZipExtractorWorker类
处理zip压缩文件
public ZipExtractorWorker(List<Map<String, ZipArchiveEntry>> entriesToBeExtracted, ZipFile zipFile, String filePath)
{
this.entriesToBeExtracted = entriesToBeExtracted;
this.zipFile = zipFile;
this.filePath = filePath;
}
entriesToBeExtracted——————要提取的文件条目
zipFile—————————————压缩文件
filePath————————————压缩文件路径
2.RarExtractorWorker类
处理rar压缩文件
public RarExtractorWorker(List<Map<String, FileHeader>> headersToBeExtracted, Archive archive, String filePath) {
this.headersToBeExtracted = headersToBeExtracted;
this.archive = archive;
this.filePath = filePath;
}
3.SevenZExtractorWorker类
处理7Z压缩文件
public SevenZExtractorWorker(List<Map<String, SevenZArchiveEntry>> entriesToBeExtracted, String filePath) {
this.entriesToBeExtracted = entriesToBeExtracted;
this.filePath = filePath;
}