Java多线程实战-求和
需求:开启五个线程,每个线程对一个给定数值从0开始累加求和。
(1)MyCallable.java
package com.storm_02;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Callable;
/**
* @Author: chenmengmeng
* @Date: 2018/10/24 14:44
* @Description:
*/
public class MyCallable implements Callable<List<String>> {
private int taskNum; //任务编号
private int number; //求和数值
MyCallable(int taskNum, int number) {
this.taskNum = taskNum;
this.number = number;
}
@Override
public List<String> call() {
System.out.println(">>>" + taskNum + " 任务启动");
Date dateTmp1 = new Date();
//执行具体的任务内容
long sum = 0;
for (int x = 1; x <= number; x++) {
sum += x;
}
//任务耗时
Date dateTmp2 = new Date();
long time = dateTmp2.getTime() - dateTmp1.getTime();
System.out.println(">>>" + taskNum + " 任务结束");
List<String> integerList = new ArrayList<>();
integerList.add(String.valueOf(time));
integerList.add(String.valueOf(sum));
return integerList;
}
}
(2)MyCallableTest.java
package com.storm_02;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* @Author: chenmengmeng
* @Date: 2018/10/24 14:42
* @Description:
*/
public class MyCallableDemo {
public static void main(String[] args) throws Exception {
System.out.println("---主程序执行开始---\n");
Date dateBegin = new Date();
//创建一个线程池
int taskSize = 5;
ExecutorService pool = Executors.newFixedThreadPool(taskSize);
//并发任务的返回值列表
List<Future> futureList = new ArrayList<>();
for (int i = 1; i <= taskSize; i++) {
//创建并发任务,执行并发任务并获取Future对象
Future future = pool.submit(new MyCallable(i, i * 50000));
futureList.add(future);
}
//关闭线程池
pool.shutdown();
Thread.currentThread().sleep(1000);
System.out.println("--------------");
//获取所有并发任务的运行结果
if (!futureList.isEmpty()) {
for (Future oneFuture : futureList) {
List<String> stringList = (List<String>) oneFuture.get();
if (!stringList.isEmpty()) {
System.out.println(">>>耗时" + stringList.get(0) + "毫秒" + "---" + "求和结果" + stringList.get(1));
}
}
}
Date dateEnd = new Date();
long time = dateEnd.getTime() - dateBegin.getTime();
System.out.println("\n---主程序执行结束,共运行时间【" + time + "】毫秒---");
}
}
(3)运行结果:不同机器可能会不一样