@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; } }}