Java多线程真实应用

       最近随着业务的发展,无线接入的酒店种类越来越多,这样会产生N种类型的订单(对用户是透明的),当用户在手机客户端上要查看自己的已经下过的订单列表时,后台需要从N个地方取订单列表来合并。最近优化程序将此处改为多线程同步取订单列表,来提高用户体验。

      为了方便并发执行任务,出现了一种专门用来执行任务的实现,也就是Executor。有两种任务:Runnable,Callable。Callable是需要返回值的任务,此处我们选用Callable。

/**
 * 取A种类的订单
 */
public class OrderAListCallable implements Callable<List<Order>> {
	@Override
	public List<Order> call() throws Exception { 
		List<Order> orderList = null;
		/**
		 * get the orderA list
		 * ……………………………………………… 
		 */
		return orderList;
	}

}

/**
*多线程取订单列表
*/
public class OrderList {
	//cpu个数
	private static int cpuCoreNumber = Runtime.getRuntime().availableProcessors(); 
	private ExecutorService exec = Executors.newFixedThreadPool(cpuCoreNumber);
	private List<Future<List<Order>>> futureList = new ArrayList<Future<List<Order>>>();
	private OrderAListCallable orderAList = new OrderAListCallable();
	private OrderBListCallable orderBList = new OrderBListCallable();
	private OrderCListCallable orderCList = new OrderCListCallable();
	
	public List<Order> getOrderList(){
		List<Order> orderList = new ArrayList<Order>(50);
		futureList.add(exec.submit(orderAList));
		futureList.add(exec.submit(orderBList));
		futureList.add(exec.submit(orderCList));
		for(Future<List<Order>> f : futureList){
			List<Order> orderListTemp = f.get(10, TimeUnit.SECONDS);//最多等10S
			if(orderListTemp!=null && !orderListTemp.isEmpty()){
				orderList.addAll(orderListTemp);
			}
		}
		return orderList;
	}
}

原理:

     将取每一种类的订单列表封装成一个Callable任务,由ExecutorService来提交任务并返回相应的Future,Future的get()方法最多阻塞10s来等待任务的结束,最终合并结果返回订单列表。

你可能感兴趣的:(多线程,future,callable,Executors,executorService)