记录一个极端线程的例子


		
		
		ExecutorService exec = Executors.newCachedThreadPool(); //创建线程池
		Long startTime = System.currentTimeMillis();.//定义开始时间
		for (OrderMasterDO orderMasterDO : listBeam) {  //一个业务的增强FOR循环  循环开启线程
			Runnable task = new Runnable() {  //new 一个线程

				@Override
				public void run() {//线程需要执行的方法
					BspRequestXml r = new BspRequestXml();
					r.setService("OrderService");
					r.setHead(info.getClintCode());

					BspOrderXml o = new BspOrderXml();
					List<BspOrderCargoXml> bspOrderCargoXmlList = new ArrayList();
					BspOrderCargoXml xml = new BspOrderCargoXml();
					xml.setName(orderMasterDO.getCargo());
					bspOrderCargoXmlList.add(xml);
					o.setBspOrderCargoXmlList(bspOrderCargoXmlList);
					o.setOrderId(orderMasterDO.getOrderId());
					o.setParcelQuantity("1");
					// 寄件人信息均为可配置项
					o.setJAddress(info.getDef1());
					o.setJContact(info.getJContact());
					o.setJTel(info.getJTel());
					o.setDAddress(orderMasterDO.getDAddress());
					o.setDContact(orderMasterDO.getDContact());
					// 此处判断订单内是否有记录快递类型 首选订单内属性 次选后台配置
					if (orderMasterDO.getServiceType() != null || !"".equals("")) {
						o.setServiceType(orderMasterDO.getServiceType());
					} else {
						o.setServiceType(info.getExpressType());
					}

					o.setDTel(orderMasterDO.getDTel());
					o.setExpressType(info.getExpressType());// 可配置项
					o.setPayMethod(info.getPayMethed());// 可配置项
					// 此处逻辑修改为 如果有微信月结卡号 则用微信 否则普通月结卡号
					BspBodyXml b = new BspBodyXml();
					b.setBspOrderXml(o);
					r.setBspBodyXml(b);
					XStream x = new XStream();
					XStream xstream = new XStream(new DomDriver("utf8"));
					xstream.processAnnotations(r.getClass()); // 识别obj类中的注解
					String request = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
					        + xstream.toXML(r);
					request = request.replace("__", "_");

					String response = bsp.BspService(
					        "http://bsp-oisp.sf-express.com/bsp-oisp/sfexpressService", request,
					        info.getClintCode(), info.getClintCheke());
					// String xml = getXmlToSend(result, info.getClintCheke());
					// String respose =
					// BspServiceImpl.sendPost("http://bsp-oisp.sf-express.com/bsp-oisp/sfexpressService",
					// xml);
					// StaticLog.info("请求报文--" + request);
					// StaticLog.info("返回报文--" + response);
					orderMasterDO.setRequest(request);
					orderMasterDO.setResponse(response);

					// master.setPayMethod(info.getPaymethed());
					// master.setCargo(info.getCargo());
					// master.setCargoNum(1);
					// master.setExpressType(info.getExpresstype());
					orderMasterDO.setBspTime(new Date());

					BspResponseXml resp = BspHelper.getBspResponseXml(response);
					String result = resp.getHead();

					if (result.equals("OK")) {
						String mailno = resp.getBspResponseBodyXml().getBspOrderResponseXml()
						        .getMailno();
						orderMasterDO.setMailnoState("1");
						orderMasterDO.setMailno(mailno);
						success.add(orderMasterDO.getId());

					} else {
						resp.getERROR();
						orderMasterDO.setMailnoState("4");
						orderMasterDO.setErrMsg(resp.getERROR());
					}
					try {
						orderMasterDao.update(orderMasterDO);
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}
			};
			exec.submit(task);//交给开启的线程池执行线程
		}
		exec.shutdown();//循环外关闭线程
		try {
			exec.awaitTermination(1, TimeUnit.SECONDS);//设置线程空闲后默认销毁时间  1秒
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		while (true) {
			if (exec.isTerminated()) {//这里是一个异步校验  死循环查询线程是否全部结束
				StaticLog.info("操作完成");
				break;//如果线程全部执行完成推出
			}
		}
		Long endTime = System.currentTimeMillis();//结束时间
		System.out.println("用时" + (endTime - startTime) / 1000 + "秒");
		StaticLog.info("开始执行垃圾回收");
		System.gc();
		StaticLog.info("垃圾回收完毕 返回页面");
		return success;
	




自己记录 自用
因为service 默认是单例的 所以不会引起多次调用方法引起的线程不安全问题
该线程简单的执行update 操作 目前没有影响

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值