Java多執行緒並行處理任務的實現

無聊的大石頭發表於2019-04-20

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\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 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\n", 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) + "]");
    }
}

相關文章