# MultithreadedProjectOptimization **Repository Path**: xurui_boy/MultithreadedProjectOptimization ## Basic Information - **Project Name**: MultithreadedProjectOptimization - **Description**: 使用java多线程实现项目性能优化 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 0 - **Created**: 2020-05-23 - **Last Updated**: 2023-12-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MultithreadedProject [项目背景](https://github.com/xurui742744538/MultithreadedProject/wiki/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E9%87%8D%E6%9E%84-%E9%A1%B9%E7%9B%AE%E8%83%8C%E6%99%AF) #### 概述 使用`java`多线程实现项目性能优化;由于每个文件中有多个题目,每个题目之间相互独立,所以文件处理和每个文件中题目的处理天然符合多线程的要求.处理文件入库、从数据库中查找相符的题目数据采用的是模拟的形式,即让当前线程睡眠相应时间。 主要是使用多线程将N个文件拆分成许多个独立的子任务`MakeDocTask`,然后将这些处理文件的子任务提交到线程池中`ExecutorCompletionService`. 将文件中的题目拆分成子任务`problemTask`,然后将这些处理题目的子任务提交到线程池中 `newFixedThreadPool`. #### 优化前后性能对比 ##### 优化前--单线程版本 处理`2`个文档每个文档中`60`个题目,处理结果 ``` 题库开始初始化........... 开始定时更新题库.......................... 题库初始化完成。 文件【0】中题目中数量:60 文件【1】中题目中数量:60 开始处理文档:pending_0....... 开始处理文档:pending_0 文档complete_1597113515668_pending_0.pdf生成耗时:30619ms 已上传至[http://www.xxxx.com/file/upload/complete_1597113515668_pending_0.pdf]耗时:5157ms 开始处理文档:pending_1....... 开始处理文档:pending_1 文档complete_1597113552227_pending_1.pdf生成耗时:31401ms 已上传至[http://www.xxxx.com/file/upload/complete_1597113552227_pending_1.pdf]耗时:5299ms 共耗时:72477ms ``` ##### 优化后--多线程版本 处理`2`个文档每个文档中`60`个题目,处理结果 ``` 题库开始初始化........... 开始定时更新题库.......................... 题库初始化完成。 文件【0】中题目中数量:60 文件【1】中题目中数量:60 开始处理文档:pending_1 开始处理文档:pending_0 文档complete_1597113872662_pending_1.pdf生成耗时:7054ms 文档complete_1597113873137_pending_0.pdf生成耗时:7529ms 已上传至[http://www.xxxx.com/file/upload/complete_1597113872662_pending_1.pdf]耗时:5331ms 已上传至[http://www.xxxx.com/file/upload/complete_1597113873137_pending_0.pdf]耗时:5103ms 共耗时:12634ms ``` 处理文档的任务 ``` private static class MakeDocTask implements Callable{ private PendingDocVo pendingDocVo; public MakeDocTask(PendingDocVo pendingDocVo) { this.pendingDocVo = pendingDocVo; } @Override public String call() throws Exception { long start = System.currentTimeMillis(); String localName = DocService.makeAsyn(pendingDocVo); System.out.println("文档"+localName+"生成耗时:"+(System.currentTimeMillis()-start)+"ms"); return localName; } } ``` 处理文档中题目的任务 ``` private static class ProblemTask implements Callable { private ProblemDBVo problemDBVo; private Integer problemId; public ProblemTask(ProblemDBVo problemDBVo, Integer problemId) { this.problemDBVo = problemDBVo; this.problemId = problemId; } @Override public ProblemCacheVo call() throws Exception { try { ProblemCacheVo problemCacheVo = new ProblemCacheVo(); problemCacheVo.setProcessedContent( BaseProblemService.makeProblem(problemId, problemDBVo.getContent())); problemCacheVo.setProblemSha(problemDBVo.getSha()); problemCache.put(problemId, problemCacheVo); return problemCacheVo; } finally { //无论正常还是异常,都需要将生成的题目的任务从缓存移除 processingProblemCache.remove(problemId); } } } ```