2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Java多线程并行处理任务的实现

Java多线程并行处理任务的实现

时间:2019-08-25 09:08:42

相关推荐

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;//为了演示效果,休眠20msThread.sleep(20);}}System.out.printf("线程:%s," + number + "!= %d\n", 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("\n已完成的线程数量: %d\n", executor.getCompletedTaskCount());for (int i = 0; i < resultList.size(); i++) {Future<Integer> result = resultList.get(i);System.out.printf("第 %d 个线程 : 是否完成:%s\n", i, result.isDone());}Thread.sleep(50);}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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\n", i, number);}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ExecutionException e) {// TODO Auto-generated catch blocke.printStackTrace();}executor.shutdown();Long endTime = System.currentTimeMillis();System.out.println("使用时间 = [" + (endTime - startTime) + "]");}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。