executorService invokeAll 方法调用Callable

原创 2015年11月19日 14:59:33


package org.herry.thread.four;


import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;


public class TestInvoke {
public static void main(String[] args) {


ExecutorService executorService = Executors.newFixedThreadPool(10);


List<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();


Callable<Integer> task = null;


for (int i = 0; i < 10; i++) {


task = new Callable<Integer>() {
@Override
public Integer call() throws Exception {


int ran = new Random().nextInt(1000);
Thread.sleep(ran);
System.out.println(Thread.currentThread().getName()
+ "休息了:" + ran);
return ran;
}
};
tasks.add(task);
}


long s = System.currentTimeMillis();


try {
List<Future<Integer>> results = executorService.invokeAll(tasks);


System.out.println("完成任务一共消耗了:" + (System.currentTimeMillis() - s)+"毫秒");

for (int i = 0; i < results.size(); i++) {

System.out.println(results.get(i).get());
}
} catch (Exception e) {
e.printStackTrace();
}


executorService.shutdown();

}
}










//通过线程池调用   exec.invokeAll(taskList)方法,taskList实现了Callable 接口,
//多线程阻塞等待结果返回示例
private void execTodoTask(Map<String, Object> paraMap,Map<String, Object> resultMap,String Ecp) {
TodoTask ecpTask2=null;
TodoTask ecpTask=null;
TodoTask bamsTask=null;
if(EipMainController.SYSTEM_ID_ECP_TWO.equals(Ecp)){
TodoServiceECP2 ecpService2 = new TodoServiceECP2();
ecpService2.setProcessService(processRunService);
ecpTask2 = new TodoTask(paraMap, ecpService2);
}else{
TodoServiceECP ecpService = new TodoServiceECP();
ecpService.setProcessService(processRunService);
ecpTask = new TodoTask(paraMap, ecpService);
TodoServiceBAMS bamsService = new TodoServiceBAMS();
bamsTask = new TodoTask(paraMap, bamsService);
}
//任务列表
List<TodoTask> taskList = new ArrayList<TodoTask>();
if(EipMainController.SYSTEM_ID_ECP_TWO.equals(Ecp)){
taskList.add(ecpTask2);
}else{
taskList.add(ecpTask);
taskList.add(bamsTask);
}
//得到线程池
ExecutorService exec = ThreadPoolUtil.getExecutorService();
try {
List<Future<Map<String, Object>>> futureList = exec.invokeAll(taskList);
for (Future<Map<String, Object>> future : futureList) {
try {
Map<String, Object> tempMap = future.get();
resultMap.putAll(tempMap);
}catch (ExecutionException e) {
e.printStackTrace();
//转换成运行时异常重新抛出
throw new RuntimeException(e);
}
}
} catch (InterruptedException e) {
//恢复线程中断状态
Thread.currentThread().interrupt();

}


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;




public class ThreadPoolUtil {

private static final ExecutorService executors;

private static final ScheduledExecutorService sheduledThreadPool;

static{
executors = Executors.newFixedThreadPool(6);
sheduledThreadPool = Executors.newScheduledThreadPool(3);
}

public static ExecutorService getExecutorService(){
return executors;
}

public static ScheduledExecutorService getScheduledExecutorService(){
return sheduledThreadPool;
}
}


//实现Callable接口
public class TodoTask implements Callable<Map<String, Object>>{

private Map<String, Object> para;

private TodoService<Map<String, Object>> service;

public TodoTask(Map<String, Object> para,TodoService<Map<String, Object>> service){
this.para = para;
this.service = service;
}

@Override
public Map<String, Object> call() throws Exception {
return service.getTodoData(para);
}


}


public interface TodoService<T> {
/**
* @return
*/
public T getTodoData(Map<String, Object> para) throws TodoException;
}


//实现服务接口
public class TodoServiceECP implements TodoService<Map<String, Object>>{

private ProcessRunService processService;

public void setProcessService(ProcessRunService processService){
this.processService = processService;
}

@Override
public Map<String, Object> getTodoData(Map<String, Object> para) {
QueryFilter filter = new QueryFilter();
PageBean page = new PageBean();
filter.setFilters(para);
filter.setPageBean(page);
page.setPagesize((Integer) para.get("pageSize"));
page.setCurrentPage(Integer.parseInt((String) para.get("currentPage")));
List<ProcessRun> processRunList = processService.getMyTodoTaskPor4Eip(filter);

Map<String, Object> result = new HashMap<String, Object>();
result.put("totalProcess", page.getTotalCount());
String systemId = (String) para.get("systemId");
if(EipMainController.SYSTEM_ID_ECP.equals(systemId)){
result.put("totalPage", page.getTotalPage());
result.put("processRunList", processRunList);
}
return result;
}




}

任务的批量提交invokeAll两种方法的区别

ExecutorService的invokeAll方法有两种用法: 1.exec.invokeAll(tasks) 2.exec.invokeAll(tasks, timeout, unit) ...
  • w1014074794
  • w1014074794
  • 2016年04月08日 18:34
  • 5816

深入学习理解java:ExecutorService invokeAll 任务的批量提交invokeAll两种方法的区别

ExecutorService的invokeAll方法有两种用法:1.exec.invokeAll(tasks)2.exec.invokeAll(tasks, timeout, unit)其中task...
  • baidu_23086307
  • baidu_23086307
  • 2016年06月23日 09:43
  • 6178

java Fork/Join框架实例详解

简介通常,使用Java来开发一个简单的并发应用程序时,会创建一些Runnable对象,然后创建对应的Thread 对象来控制程序中这些线程的创建、执行以及线程的状态。自从Java 5开始引入了Exec...
  • qilixiang012
  • qilixiang012
  • 2015年05月06日 23:02
  • 2234

newScheduledThreadPool创建可间隔时间执行的线程池

newScheduledThreadPool,创建一个可间隔时间执行的线程池,并且可以指定数量,以前确实没这么写过,都是写while循环,看来后面我要恶补一下线程池的技术了,下面是我抽出来的部分代码。...
  • minicto
  • minicto
  • 2016年10月20日 12:42
  • 937

四种线程池创建及使用(一)newScheduledThreadPool和newCachedThreadPool的使用方法详解

newScheduledThreadPool 创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。 newCachedThreadPool 创建一个可缓存的线程池...
  • huanyuminhao
  • huanyuminhao
  • 2016年07月20日 23:12
  • 9172

java定时任务的两种实现方式

一、Timer现在项目中用到需要定时去检查文件是否更新的功能。timer正好用于此处。用法很简单,new一个timer,然后写一个timertask的子类即可。package comz.autoupd...
  • u013991521
  • u013991521
  • 2017年02月15日 17:48
  • 570

java 四种线程池

Java通过Executors提供四种线程池,各有用处,下面是列子:package executor;import java.util.concurrent.ExecutorService; impo...
  • a11101171
  • a11101171
  • 2015年11月26日 11:42
  • 1519

java5后的并发池

本文可作为传智播客《张孝祥-Java多线程与并发库高级应用》视频的学习记录。 为什么需要并发池 之前写并发的时候 new Thread(new Runnable(){ public ...
  • dlf123321
  • dlf123321
  • 2015年01月19日 17:38
  • 963

使用Java7提供的Fork/Join框架

在Java7中,JDK提供对多线程开发提供了一个非常强大的框架,就是Fork/Join框架。这个是对原来的Executors更 进一步,在原来的基础上增加了并行分治计算中的一种Work-steali...
  • a352193394
  • a352193394
  • 2014年10月07日 23:55
  • 17034

newScheduledThreadPool延时任务线程池,实现原理

Excutors的newScheduleThreadPool程序结构,我们在构造ThreadPoolExcute时,Queue队列使用了DelayedWorkQueue,这是一个可延时执行阻塞任务的队...
  • lisuyibmd
  • lisuyibmd
  • 2016年11月09日 10:29
  • 1933
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:executorService invokeAll 方法调用Callable
举报原因:
原因补充:

(最多只允许输入30个字)