50,503
社区成员
发帖
与我相关
我的任务
分享
package com.jeemis.framework.file.util;
import java.util.*;
import java.util.concurrent.*;
/**
* Project Name: AirPortEHome
* Package Name: com.jeemis.framework.file.util
* File Name: Test
* 2019/1/2 13:16 - LiZongBao
* Copyright (c) 2017,TravelSky. All Rights Reserved.
*/
public class Test {
public static void main(String[] args) throws ExecutionException,InterruptedException {
//先产生一个大于10的随机整数n
int n=(int)(1+Math.random()*(10-1+1));//(数据类型)(最小值+Math.random()*(最大值-最小值+1))
//再产生n个随机数并存放于数组中,
int[] nArr=new int[n];
for(int i=0;i<n;i++){
nArr[i]=(int)(1+Math.random()*10);
}
// 然后将这n个数相加,并求出这n个数的和s1,同时计算出求s1所需的时间t1。
long startMili=System.currentTimeMillis();// 当前时间对应的毫秒数
int s1=0;
for(int i=0;i<n;i++){
s1+=nArr[i];
}
long endMili=System.currentTimeMillis();
long t1=endMili-startMili;
System.out.println("t1总耗时为:"+t1+"毫秒");
System.out.println("这n个数的和s1为:"+s1);
// 接着让程序创建两个线程并发地进行相加运算,
int taskSize = 2;
// 创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(taskSize);
// 创建多个有返回值的任务
List<Future> list = new ArrayList<Future>();
// 其中,一个线程计算前一半数之和s21,
// 另一个线程计算后一半数之和s22,
for (int i = 0; i < taskSize; i++) {
Callable c = new MyCallable(i,nArr);
// 执行任务并获取Future对象
Future f = pool.submit(c);
// System.out.println(">>>" + f.get().toString());
list.add(f);
}
// 关闭线程池
pool.shutdown();
// 获取所有并发任务的运行结果
long t2=0;
int s2=0;
for (Future f : list) {
// 从Future对象上获取任务的返回值,并输出到控制台
Map m= (Map) f.get();
System.out.println(">>>" + f.get().toString());
// 然后将s21和s22这两个数相加得到和s2,
s2+=(int)m.get("s2");
// 计算采用双线程进行求和运算所花费的时间t2。
t2+=(long)m.get("time");
}
// 比较s1和s2,以及t1和t2的大小。
System.out.println("t2总耗时为:"+t2+"毫秒");
System.out.println("这n个数的和s2为:"+s2);
// 注:在计算采用双线程求和的时间t2时,只要计算从创建双线程到最终得到s2的时间间隔就可以了。
}
static class MyCallable implements Callable<Object> {
private int taskNum;
private int[] nArr;
MyCallable(int taskNum,int[] nArr) {
this.taskNum = taskNum;
this.nArr = nArr;
}
public Object call() throws Exception {
System.out.println(">>>" + taskNum + "任务启动");
Date dateTmp1 = new Date();
int s2=0;
if(taskNum==0){
for(int i=0,size=nArr.length/2;i<size;i++){
s2+=nArr[i];
}
}else if(taskNum==1){
for(int i=nArr.length/2,size=nArr.length;i<size;i++){
s2+=nArr[i];
}
}
Date dateTmp2 = new Date();
long time = dateTmp2.getTime() - dateTmp1.getTime();
Map m=new HashMap();
m.put("time",time);
m.put("s2",s2);
System.out.println(">>>" + taskNum + "任务终止");
return m;
}
}
}
试了几个结果,=10的话有点太小了,时间一直都是0,下面是加大为100000000之后的计算结果。
t1总耗时为:9毫秒
这n个数的和s1为:35255207
>>>1任务启动
>>>0任务启动
>>>1任务终止
Disconnected from the target VM, address: '127.0.0.1:55870', transport: 'socket'
>>>0任务终止
>>>{time=14, s2=17627876}
>>>{time=11, s2=17627331}
t2总耗时为:25毫秒
这n个数的和s2为:35255207