Java多线程并行处理任务的实现
Java多线程并行处理任务的实现
在实际项目开发的过程中,遇到过需要处理一个由多个子任务组成的任务的问题.顺序处理起来会造成响应时间超长,用户体验不好的问题.我想到一个解决方案,即使用多线程并行处理子任务.思路就是使用ThreadPoolExecutor线程池,然后使用一个list保存所有线程的实例引用.以下是代码实现.
以下是代码实现
FactorialCalculator 类:用于实现具体的业务处理
package ThreadTask; import java.util.concurrent.Callable; public class FactorialCalculator implements Callable<Integer> { private int number; public FactorialCalculator(int number) { this.number = number; } //计算阶乘 public Integer call() throws Exception { Integer result = 1; if (number == 0 || number == 1) result = 1; else { for (int i = 2; i <= number; i++) { result *= i; //为了演示效果,休眠20ms Thread.sleep(20); } } System.out.printf("线程:%s," + number + "!= %d ", Thread.currentThread().getName(), result); return result; } }
Main 类:用于实现多线程任务的实现和处理
import ThreadTask.FactorialCalculator; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadPoolExecutor; public class Main { public static void main(String[] args) { Long startTime = System.currentTimeMillis(); ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);//创建只有2个线程的线程池 //存放结果的列表 List<Future<Integer>> resultList = new ArrayList<>(); //通过Random类生成一个随机数生成器 Random random = new Random(); for (int i = 0; i < 10; i++) { int number = random.nextInt(10); FactorialCalculator calculator = new FactorialCalculator(number); Future<Integer> result = executor.submit(calculator); resultList.add(result); } //创建一个循环来监控执行器的状态 try { while (executor.getCompletedTaskCount() < resultList.size()) { System.out.printf(" 已完成的线程数量: %d ", executor.getCompletedTaskCount()); for (int i = 0; i < resultList.size(); i++) { Future<Integer> result = resultList.get(i); System.out.printf("第 %d 个线程 : 是否完成:%s ", i, result.isDone()); } Thread.sleep(50); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("全部线程执行结束"); try { for (int i = 0; i < resultList.size(); i++) { Future<Integer> result = resultList.get(i); Integer number = null; number = result.get(); System.out.printf("第 %d 个线程 执行结果是: %d ", i, number); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } executor.shutdown(); Long endTime = System.currentTimeMillis(); System.out.println("使用时间 = [" + (endTime - startTime) + "]"); } }
上一篇:
IDEA上Java项目控制台中文乱码