java常用的带返回值的并发编程


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


  以上,就做到了,多任务,多并发返回。欢迎探讨。




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值