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的运算结果 基本可以认为在我的电脑上采用多线程计算结果可以加快一倍!
扩展
当然,对于多线程计算,我们可以调节线程计算个数的力度.从而求的最合理的范围,大家有兴趣的可以自己去试试!
结束语
本人也是菜鸟一枚!如果有什么不足之处也希望大家谅解!
转载请注明原文地址: https://ju.6miu.com/read-550236.html