1,需要一个线程池:concurrent包下的:
ExecutorService pool = Executors.newCachedThreadPool();
用来执行多任务线程的线程池。
2, 多任务调度者,需要实现callable接口:如:
class Mainhandeler implements Callable<ResultVo>
需要实现call方法
@Override
public ResultVo call()throws Exception {
// 业务逻辑处理 P1
}
3,使用FutureTask 来返回处理结果数据ResultVo
FutureTask<ResultVo> fs = new FutureTask<ResultVo>(new Mainhandeler(param,resultVo));
//线程池来执行
pool.execute(new Thread(fs));
//循环查询是否处理完成
while(true){
if(fs.isDone()){
try {
resultVO = fs.get();//获取结果数据
}catch (Exception e) {
e.printStackTrace();
}
break;
}
Thread.sleep(200);
}
这样就做到拿到返回的结果数据。
4, 到第三步只是做到拿到处理结果,但是并没有体现出并发执行
这里要并发处理,处理完后,将各个任务数据集中返回。
同样的还是需要使用FutureTask来处理
每个任务一个调度类,每个类都实现Callable<ResultVo>,并且重写call方法,call方法处理各自任务的业务逻辑。
然后,
//并行调用 CredisQuery实现Callable<ResultVo>
CredisQuery creditquery = new CredisQuery(param,resultVo);
FutureTask<ResultVo> ft1 = new FutureTask<ResultVo>((Callable<ResultVo>)creditquery);
同样的多个任务:就会有上面的 ft2, ft3, ft4, ft5, ft6, ft7
然后将上面的ft存在一个map中,线程放在activeThread中,目的是在使用线程池pool执行activeThread(多个一起执行)后,可以循环这个map来获取返回值。
private Map<Integer, FutureTask<InterfaceResultVo>> activeThreadResultMap =new HashMap<Integer, FutureTask<InterfaceResultVo>>();
private List<Thread>activeThread =new ArrayList<Thread>();
Thread thread= new Thread(ft);thread.setDaemon(true)activeThread.add(thread);
if(activeThread!=null && activeThread.size()>0){
for(Thread thread:activeThread){
pool.execute(thread);//交给线程池去执行
}
}
Iterator it = activeThreadResultMap.entrySet().iterator();//遍历map,循环查寻是否已经处理完毕
//如果没有运行的线程对象,则结束
while(it.hasNext()){
Map.Entry entry = (Map.Entry)it.next();
//获取接口线程对象
FutureTask<ResultVo> ft = (FutureTask<ResultVo>entry.getValue();
//判断是否查询结束
if(ft.isDone()){
it.remove();
count++;
resultVo.setCompleteCount();
resultVo = ft.get();//获取结果,这里实际上可以获取多个结果数据(对象地址传递),resultVo里头包涵多个返回参数,不同的任务返回设置属于自己的参数即可,
if(resultVo!=null &&resultVo.getCompleteCount()==runCount){
break;
}
以上,就做到了,多任务,多并发返回。欢迎探讨。