系统性能优化(二)

系统性能优化(一) 中我们初步完成了我们的需求,但是其系统速度不忍直视,那么急需我们继续改进,我们初步完成的只是一个单线程的,现在我们就可以用我们的多线程来进行优化。


首先我们每个用户之间生成文档、上传文档是互相不影响的,所以我们在这两个部分就可以使用多线程进行处理,我们定义出两个线程池,分别进行处理生成文档和上传文档。
系统性能优化(二)
其中线程池的核心线程数,我们定义为机器核心数的两倍,因为我们这个需求主要是 IO 密集型的操作,根据 线程池(二)—— ThreadPoolExecutor 详解 最后我们说到合理配置线程池的时候,我们提到过。
系统性能优化(二)



然后生成文档和上传文档都是有返回值的,因为生成文档需要返回生成的文档存放的地址,供我们后续将其上传至云空间供用户下载,我们上传文档肯定也是需要把 url 地址返回出来的。所以我们使用 Callable 接口。
系统性能优化(二)
其中上图红框中生成文档的逻辑,与我们之前单线程实现的一致,没有任何改变。

系统性能优化(二)
其中上图红框中上传文档的逻辑,与我们之前单线程实现的一致,没有任何改变。




这里我们我们发现我们上述上传文档的时候,是需要等待我们我们生成文档完成后,返回给我们的本机地址的,这里我们可不可以使用 Vector 或者堵塞队列来实现呢?

可以,但是我们发现我们在获取其返回值的时候是会被堵塞的,我们后面的线程执行完成了,也必须等待前面的线程完成后,才可以取得。所以我们使用CompletionService,具体见 线程池(六)—— CompletionService
系统性能优化(二)



最后我们来运行我们的测试类
系统性能优化(二)

运行结果如下:
系统性能优化(二)


这里大致耗时 174 秒,和我们之前需耗时 3200 秒,性能几乎提高了 18 倍左右。

另外由于我们每个任务需 50-55 秒左右,花费时间比较久,所以我们继续提高线程池中的工作线程数,我们系统的性能还会进一步提升。