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

时间:2024-11-24 06:57:39

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

在实际项目开发的过程中,遇到过需要处理一个由多个子任务组成的任务的问题.顺序处理起来会造成响应时间超长,用户体验不好的问题.我想到一个解决方案,即使用多线程并行处理子任务.思路就是使用ThreadPoolExecutor线程池,然后使用一个list保存所有线程的实例引用.以下是代码实现.

以下是代码实现

FactorialCalculator 类:用于实现具体的业务处理

package ThreadTask;

import ;

public class FactorialCalculator implements Callable<Integer> {
    private int number;

    public FactorialCalculator(int 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
                (20);
            }
        }
        ("线程:%s," + number + "!= %d\n", ().getName(), result);
        return result;
    }

}

Main 类:用于实现多线程任务的实现和处理

import ;

import ;
import ;
import ;
import ;
import ;
import ;
import ;


public class Main {

    public static void main(String[] args) {
        Long startTime = ();
        ThreadPoolExecutor executor = (ThreadPoolExecutor) (2);//创建只有2个线程的线程池
        //存放结果的列表
        List<Future<Integer>> resultList = new ArrayList<>();
        //通过Random类生成一个随机数生成器
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            int number = (10);
            FactorialCalculator calculator = new FactorialCalculator(number);
            Future<Integer> result = (calculator);
            (result);
        }
        //创建一个循环来监控执行器的状态
        try {
            while (() < ()) {
                ("\n已完成的线程数量: %d\n", ());
                for (int i = 0; i < (); i++) {
                    Future<Integer> result = (i);
                    ("第 %d 个线程 : 是否完成:%s\n", i, ());
                }
                (50);
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            ();
        }
        ("全部线程执行结束");
        try {
            for (int i = 0; i < (); i++) {
                Future<Integer> result = (i);
                Integer number = null;
                number = ();
                ("第 %d 个线程 执行结果是: %d\n", i, number);
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            ();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            ();
        }
        ();
        Long endTime = ();
        ("使用时间 = [" + (endTime - startTime) + "]");
    }
}

相关文章