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




}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

ExecutorService的invokeAll方法有两种用法:1.exec.invokeAll(tasks)2.exec.invokeAll(tasks, timeout, unit)其中task...

Java并发专题 带返回结果的批量任务执行 CompletionService ExecutorService.invokeAll

一般情况下,我们使用Runnable作为基本的任务表示形式,但是Runnable是一种有很大局限的抽象,run方法中只能记录日志,打印,或者把数据汇总入某个容器(一方面内存消耗大,另一方面需要控制同步...

带返回结果的批量任务执行 CompletionService ExecutorService.invokeAll

一般情况下,我们使用Runnable作为基本的任务表示形式,但是Runnable是一种有很大局限的抽象,run方法中只能记录日志,打印,或者把数据汇总入某个容器(一方面内存消耗大,另一方面需要控制同步...

ExecutorService.invokeAny()和ExecutorService.invokeAll()的使用剖析

ExecutorService是JDK并发工具包提供的一个核心接口,相当于一个线程池,提供执行任务和管理生命周期的方法。ExecutorService接口中的大部分API都是比较容易上手使用的,本文主...

ExecutorService.invokeAny()和ExecutorService.invokeAll()的使用剖析

ExecutorService是JDK并发工具包提供的一个核心接口,相当于一个线程池,提供执行任务和管理生命周期的方法。 ExecutorService接口中的大部分API都是比较容易上手使用的,本文...

ExecutorService.invokeAny()和ExecutorService.invokeAll()的使用剖析

原文:http://blog.csdn.net/aitangyong/article/details/38172189 ExecutorService是JDK并发工具包提供的一个核心接口,相当于...

ExecutorService.invokeAny()和ExecutorService.invokeAll()的使用剖析

ExecutorService是JDK并发工具包提供的一个核心接口,相当于一个线程池,提供执行任务和管理生命周期的方法。 ExecutorService接口中的大部分API都是比较容易上手使用的,本文...

java ExecutorService.invokeAny()和ExecutorService.invokeAll()的使用剖析

ExecutorService是JDK并发工具包提供的一个核心接口,相当于一个线程池,提供执行任务和管理生命周期的方法。ExecutorService接口中的大部分API都是比较容易上手使用的,本文主...

ExecutorService、Callable、Future

Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。就相当于下了一张...

Java并发编程之Executor,Executors,ExecutorService,Future,Callable

Java并发编程之Executor,Executors,ExecutorService,Future,Callable
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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