java用多線程進行連結清單求和
上周不知在哪裡看到幾個大神們在讨論利用多線程對Integer連結清單進行求和,周末剛好沒事,就自己動手實踐了一下!
實體硬體
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的運算結果
100000的運算結果
1000000的運算結果
基本可以認為在我的電腦上采用多線程計算結果可以加快一倍!
擴充
當然,對于多線程計算,我們可以調節線程計算個數的力度.進而求的最合理的範圍,大家有興趣的可以自己去試試!
結束語
本人也是菜鳥一枚!如果有什麼不足之處也希望大家諒解!