@Override
public String findJdbcDataSource() throws ExecutionException, InterruptedException {
//1、获取任务列表 连接信息
List<DataSouceJdbc> jdbcDataSource = dataSouceJdbcMapper.findJdbcDataSource();
List<FutureTask<Integer>> taskList = new ArrayList<>();
for (int i = 0 , n = jdbcDataSource.size(); i < n; i++) {
//创建有返回值 多线程任务
SearchLoanTask searchLoanTask = new SearchLoanTask(jdbcDataSource.get(i),this);
//提交任务 收集返回结果
FutureTask<Integer> futureTask = new FutureTask<>(searchLoanTask);
//任务添加到容器,容器存储当前执行结果
taskList.add(futureTask);
//任务执行
BasicExecuteThreadPool.getInstance().submit(futureTask);
// BasicExecuteThreadPool.getInstance().execute(searchLoanTask);
}
return computeTaskItem(taskList,jdbcDataSource);
}
/**
* 计算返回结果是否 为预期值
* @param taskList
* @param jdbcDataSource
* @return
* @throws ExecutionException
* @throws InterruptedException
*/
public String computeTaskItem(List<FutureTask<Integer>> taskList, List<DataSouceJdbc> jdbcDataSource) throws ExecutionException, InterruptedException {
Integer result = 0;
// 从future中取出值来
for (FutureTask<Integer> future : taskList) {
result = result + future.get();
}
return result == jdbcDataSource.size() ? "任务全部执行完成" : (jdbcDataSource.size() - result) + "条任务执行失败";
}
@Override
public String findJdbcDataSource() throws ExecutionException, InterruptedException {
List<DataSouceJdbc> jdbcDataSource = dataSouceJdbcMapper.findJdbcDataSource();
List<FutureTask<Integer>> taskList = new ArrayList<>();
for (int i = 0 , n = jdbcDataSource.size(); i < n; i++) {
//创建有返回值 多线程任务
SearchLoanTask searchLoanTask = new SearchLoanTask(jdbcDataSource.get(i),this);
//提交任务 收集返回结果
FutureTask<Integer> futureTask = new FutureTask<>(searchLoanTask);
//任务添加到容器,容器存储当前执行结果
taskList.add(futureTask);
//任务执行
BasicExecuteThreadPool.getInstance().submit(futureTask);
// BasicExecuteThreadPool.getInstance().execute(searchLoanTask);
}
return computeTaskItem(taskList,jdbcDataSource);
}
}
/**
* 计算返回结果是否 为预期值
* @param taskList
* @param jdbcDataSource
* @return
* @throws ExecutionException
* @throws InterruptedException
*/
public String computeTaskItem(List<FutureTask<Integer>> taskList, List<DataSouceJdbc> jdbcDataSource) throws ExecutionException, InterruptedException {
Integer result = 0;
// 从future中取出值来
for (FutureTask<Integer> future : taskList) {
result = result + future.get();
}
return result == jdbcDataSource.size() ? "任务全部执行完成" : (jdbcDataSource.size() - result) + "条任务失败";
}
package cn.zhm.day3;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class FutureTaskForMultiCompute {
public static void main(String[] args) throws InterruptedException,
ExecutionException {
FutureTaskForMultiCompute inst = new FutureTaskForMultiCompute();
// 创建任务集合 FutureTask:可用于异步获取执行结果或取消执行任务的场景
List<FutureTask<Integer>> taskList = new ArrayList<FutureTask<Integer>>();
ExecutorService execut = Executors.newScheduledThreadPool(5);
for (int i = 0; i < 10; i++) {
// 传入Callable对象创建FutureTask对象
FutureTask<Integer> task = new FutureTask<Integer>(
inst.new ComputeTask(i, "" + i));
// 把多个future放在集合中
taskList.add(task);
// 提交给线程池执行任务,也可以通过exec.invokeAll(taskList)一次性提交所有任务;
execut.submit(task);
System.out.println("所有计算任务提交完毕, 主线程接着干其他事情!");
}
Integer result = 0;
// 从future中取出值来
for (FutureTask<Integer> future : taskList) {
result = result + future.get();
}
// 打印求出来的值
System.out.println("result=" + result);
}
public class ComputeTask implements Callable<Integer> {
private Integer result = 0;
private String taskName = "";
ComputeTask(Integer result, String taskName) {
this.result = result;
this.taskName = taskName;
System.out.println("生成子线程计算任务: " + taskName);
}
public String getTaskName() {
return this.taskName;
}
@Override
public Integer call() throws Exception {
for (int i = 0; i < 10; i++) {
result += i;
}
Thread.sleep(5000);
System.out.println("子线程计算任务: " + taskName + " 执行完成!");
return result;
}
}
}