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 = 0; //结果
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, 0, 0);
}
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() == 0) {
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 = -1; //正在运行的线程个数
public Long startTime;//开始时间
public Long endTime;//结束时间
/**
* @goal 开始计算的入口
* @author Jason
* @param list
*/
public void startCalculate(List<Integer> list) {
startTime = System.currentTimeMillis();
threadSize = (list.size() / 10000) + 1; //计算需要的线程数
for(int i =0;i<threadSize;i++){
Calculate calculate= new CalculateImp(list,this,i*10000,list.size()>(i+1)*10000?(i+1)*10000:list.size());
new Thread(calculate).start();
}
}
/**
* @goal:得到结果的回调函数
* @author Jason
* @paramresult
*/
@Override
public void statistic(int result) {
threadSize--;
total += result;
if (threadSize == 0) {
endTime=System.currentTimeMillis();
reset();
System.out.println("结果:"+total);
System.out.println("用时:"+(endTime-startTime));
}
}
public void reset(){
threadSize=-1;
}
}
测试方法
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=0;i<=size;i++){
number.add(i);
}
}
/**
* @goal:主函数
* @author Jason
* @param args
*/
public static void main(String[] args) {
createNumber(1000000);
//单线程计算
int result =0;
Long startTime=System.currentTimeMillis();
for(int i=0;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的运算结果
基本可以认为在我的电脑上采用多线程计算结果可以加快一倍!
扩展
当然,对于多线程计算,我们可以调节线程计算个数的力度.从而求的最合理的范围,大家有兴趣的可以自己去试试!
结束语
本人也是菜鸟一枚!如果有什么不足之处也希望大家谅解!