天天看點

java用多線程進行連結清單求和器java用多線程進行連結清單求和

java用多線程進行連結清單求和

上周不知在哪裡看到幾個大神們在讨論利用多線程對Integer連結清單進行求和,周末剛好沒事,就自己動手實踐了一下!

實體硬體

java用多線程進行連結清單求和器java用多線程進行連結清單求和
java用多線程進行連結清單求和器java用多線程進行連結清單求和
ps:系統為固态硬碟

jdk版本:1.8

接口

import java.util.List;
//多線程計算的接口
public interface Calculate extends Runnable{
    public void calculate(List<Integer> list); //計算的實作
    public void returnResult(StatisticsRestult s);//結果傳回
}

//結果統計的接口
public interface StatisticsRestult {
    public void statistic(int result); //統計計算結果
}
           

實作類

import java.util.List;

//多線程計算的實作類
public class CalculateImp implements Calculate {
    private int result = ; //結果
    private List<Integer> list;//計算的連結清單
    private int end;//連結清單的結束位置
    private int start;//連結清單的開始位置
    private StatisticsRestult statistics;//計算結果傳回的對象
    /**
     * @goal 構造函數
     * @author Jason
     * @param list
     * @param statistics
     */
    public CalculateImp(List<Integer> list, StatisticsRestult statistics) {
        this(list, statistics, , );
    }

    public CalculateImp(List<Integer> list, StatisticsRestult statistics, int start, int end) {
        this.list = list;
        this.statistics = statistics;
        this.start = start;
        this.end = end;
    }
    /**
     * @goal:計算的實作方法
     * @author Jason
     * @param list
     */
    @Override
    public void calculate(List<Integer> list) {
        if (list.size() == ) {
            returnResult(statistics);
            return;
        }
        for (int i = start; i < end; i++) {
            result += list.get(i);
        }
        returnResult(statistics);
    }

    /**
     * @goal :計算結果的傳回方法
     * @author Jason
     * @param result
     */
    @Override
    public void returnResult(StatisticsRestult s) {
        s.statistic(result);
    }

    /**
     * @goal:多線程的啟動
     * @author Jason
     * 
     */
    @Override
    public void run() {
        calculate(list);
    }

}

import java.util.List;

public class StatisticsResultImp implements StatisticsRestult {
    private int total; //最終結果
    public int threadSize = -; //正在運作的線程個數
    public Long startTime;//開始時間
    public Long endTime;//結束時間

    /**
     * @goal 開始計算的入口
     * @author Jason
     * @param list
     */
    public void startCalculate(List<Integer> list) {
        startTime = System.currentTimeMillis();
        threadSize = (list.size() / ) + ; //計算需要的線程數
        for(int i =;i<threadSize;i++){
            Calculate calculate= new CalculateImp(list,this,i*,list.size()>(i+)*?(i+)*:list.size());
            new Thread(calculate).start();
        }
    }

    /**
     * @goal:得到結果的回調函數
     * @author Jason
     * @paramresult
     */
    @Override
    public void statistic(int result) {
        threadSize--;
        total += result;
        if (threadSize == ) {
            endTime=System.currentTimeMillis();
            reset();

            System.out.println("結果:"+total);
            System.out.println("用時:"+(endTime-startTime));
        }
    }
    public void reset(){
        threadSize=-;
    }

}

           

測試方法

import java.util.LinkedList;
import java.util.List;

public class Main {
    static List<Integer> number=new LinkedList<Integer>(); //計算的連結清單
    /**
     * @goal:産生計算的連結清單
     * @author Jason
     * @param size
     */
    public static void createNumber(int size){
        for(int i=;i<=size;i++){
            number.add(i);
        }
    }
    /**
     * @goal:主函數
     * @author Jason
     * @param args
     */
    public static void main(String[] args) {
        createNumber();
        //單線程計算
        int result =;
        Long startTime=System.currentTimeMillis();
        for(int i=;i<number.size();i++){
            result+=number.get(i);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("結果:"+result);
        System.out.println("單線程用時"+(endTime-startTime));
        //多線程計算
        StatisticsResultImp calculate = new StatisticsResultImp();
        startTime=System.currentTimeMillis();
        calculate.startCalculate(number);

    }
}
           

結果截圖

10000的運算結果

java用多線程進行連結清單求和器java用多線程進行連結清單求和

100000的運算結果

java用多線程進行連結清單求和器java用多線程進行連結清單求和

1000000的運算結果

java用多線程進行連結清單求和器java用多線程進行連結清單求和

基本可以認為在我的電腦上采用多線程計算結果可以加快一倍!

擴充

當然,對于多線程計算,我們可以調節線程計算個數的力度.進而求的最合理的範圍,大家有興趣的可以自己去試試!
           

結束語

本人也是菜鳥一枚!如果有什麼不足之處也希望大家諒解!