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


   1,需要一个线程池:concurrent包下的:


   ExecutorService pool = Executors.newCachedThreadPool();


  用来执行多任务线程的线程池。


2, 多任务调度者,需要实现callable接口:如:

class Mainhandeler implements Callable

    需要实现call方法

@Override

public ResultVo call()throws Exception {

      // 业务逻辑处理   P1



3,使用FutureTask 来返回处理结果数据ResultVo


  

FutureTask fs = new FutureTask(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,并且重写call方法,call方法处理各自任务的业务逻辑。


然后,

//并行调用  CredisQuery实现Callable

CredisQuery creditquery = new CredisQuery(param,resultVo);  

FutureTask ft1 = new FutureTask((Callable)creditquery);


同样的多个任务:就会有上面的 ft2, ft3, ft4, ft5, ft6, ft7


然后将上面的ft存在一个map中,线程放在activeThread中,目的是在使用线程池pool执行activeThread(多个一起执行)后,可以循环这个map来获取返回值。

private MapactiveThreadResultMap =new HashMap>();

  

private ListactiveThread =new ArrayList();


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 ft = (FutureTaskentry.getValue();
					//判断是否查询结束
					if(ft.isDone()){
						it.remove();
						count++;
						resultVo.setCompleteCount();

resultVo = ft.get();//获取结果,这里实际上可以获取多个结果数据(对象地址传递),resultVo里头包涵多个返回参数,不同的任务返回设置属于自己的参数即可,
if(resultVo!=null &&resultVo.getCompleteCount()==runCount){
break;
}


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




你可能感兴趣的:(java多线程高并发)