行业软件中的多线程编程探讨
?
试想一下以下经常碰到的业务环境的解决方案,比如未联网的*****系统:
?
QName qname = new QName(namespace, operateName);RPCServiceClient client = new RPCServiceClient();Options options = new Options();options.setTo(new EndpointReference(srvcUrl));options.setAction("urn:" + operateName);client.setOptions(options);client.invokeNonBlocking(qname, param, new AxisCallback() {public void onMessage(MessageContext mc) {//回调处理代码}public void onFault(MessageContext messageContext) {}public void onError(Exception e) {e.printStackTrace();}public void onComplete() {}});如何利用线程池管理多线程,核心代码如下:
public List invokeAll(List<TraversalProvince> tasks, long timeout) { List nodes = new ArrayList(tasks.size()); try { List<Future<CityResult>> futures = null; if (timeout < 0) { futures = executorService.invokeAll(tasks); } else { futures = executorService.invokeAll(tasks, timeout, TimeUnit.MILLISECONDS); } for (Future future : futures) { try { nodes.add(future.get()); } catch (ExecutionException e) { e.printStackTrace(); } } } catch (InterruptedException e) { e.printStackTrace(); } return nodes; }?对结果产生的回调处理:
String taskno = StrCharUtil.formatNullStr(request.getParameter("taskno"));String callback = StrCharUtil.formatNullStr(request.getParameter("callback"));for(int i=0;i<10;i++){Thread.sleep(1000);//10秒内未获取到数据表示失败String res = StrCharUtil.formatNullStr(cacheTask.get(taskno));if(!res.equals("")){if(callback.equals("")){out.println(res);}else{out.println(callback+"("+res+")");}return;}}out.println("超时(timeout)");?
?
以下是Log4J跟踪的运行效果:
?
2010 五月 07 14:08:18 INFO cn.aw.task.REHunt - [14:08:18]接收到新请求:reqid=030c95364050453987c6b9a597e80295id=1,type=null,mode=0,prov=zhejiang,city=ningbo,city=hangzhou,city=shaoxing,city=jinhua,city=zhoushan,prov=shanghai,city=putuo2010 五月 07 14:08:18 INFO cn.aw.task.TraversalProvince - ================================线程: ningbo 开始处理...2010 五月 07 14:08:18 INFO cn.aw.task.TraversalProvince - ================================线程: hangzhou 开始处理...2010 五月 07 14:08:18 INFO cn.aw.task.TraversalProvince - ================================线程: shaoxing 开始处理...2010 五月 07 14:08:18 INFO cn.aw.task.TraversalProvince - ================================线程: jinhua 开始处理...2010 五月 07 14:08:18 INFO cn.aw.task.TraversalProvince - ================================线程: zhoushan 开始处理...2010 五月 07 14:08:18 INFO cn.aw.task.TraversalProvince - ================================线程: putuo 开始处理...2010 五月 07 14:08:18 INFO cn.aw.servlet.AjaxServlet - 任务缓存大小:02010 五月 07 14:08:18 INFO cn.aw.task.CityTask - endTask:ningbo2010 五月 07 14:08:18 INFO cn.aw.task.CityTask - endTask:putuo2010 五月 07 14:08:19 INFO cn.aw.task.CityTask - endTask:hangzhou2010 五月 07 14:08:19 INFO cn.aw.task.CityTask - endTask:shaoxing2010 五月 07 14:08:19 INFO cn.aw.task.CityTask - endTask:jinhua2010 五月 07 14:08:19 INFO cn.aw.task.CityTask - 无法查询【zhoushan】的【1】信息,出错2010 五月 07 14:08:19 INFO cn.aw.task.CityTask - endTask:zhoushan2010 五月 07 14:08:19 INFO cn.aw.task.REHunt - 开始调用返回URL:http://localhost:8080/ws/ajax...2010 五月 07 14:08:19 INFO cn.aw.servlet.AjaxServlet - 已缓存结果:030c95364050453987c6b9a597e80295
如果你有更好的思路,欢迎探讨,主要解决查询效率问题和并发问题!