简单的线程池管理多线程

原创
2016/04/15 18:28
阅读数 176

随tomcat启动的servlet来启动线程

public class MyExpServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private MyExpThread myExpThread;
	private MyStockThread myStockThread;

	public MyExpServlet() {
	}

	public void init() {
		String str = null;
		if (str == null && myExpThread == null) {
			myExpThread = new MyExpThread();
			myStockThread = new MyStockThread();
//			myExpThread.start(); // servlet 上下文初始化时启动 socket
//			System.out.println("线程开始!");
			//创建一个含有2个线程的线程池
		    ExecutorService threadPool = Executors.newFixedThreadPool(2);

		    // 线程池中执行线程
		    threadPool.execute(myExpThread);
		    threadPool.execute(myStockThread);
		    threadPool.shutdown();
//			myExpThread.interrupt();
//			try {
//				myExpThread.join();
//			} catch (InterruptedException e) {
//				e.printStackTrace();
//			}
//			System.out.println("线程结束!"); 
		}
	}

	public void doGet(HttpServletRequest httpservletrequest,
			HttpServletResponse httpservletresponse) throws ServletException,
			IOException {
	}

	public void destory() {
		if (myExpThread != null && myExpThread.isInterrupted()) {
			myExpThread.interrupt();
		}
	}
}

上个线程在前几个博客,这个线程用来付款时间超过30分钟就修改订单状态并将商品库存和销售量修改回来

class MyStockThread extends Thread {
	public void run() {
		while (!this.isInterrupted()) {// 线程未中断执行循环
			// ------------------ 开始执行 ---------------------------
			//订单失效时间及id
			Vector list_indiana = Constant.list_indiana;
			if(list_indiana!=null&&!list_indiana.isEmpty()){
				for(int i=0;i<list_indiana.size();i++){
					Order_Invalid order_Invalid = (Order_Invalid)list_indiana.get(i);
					String id = order_Invalid.getId()+"";
					Date enddate= order_Invalid.getEnddate();
					Date sysdate = new Date();
					if(sysdate.after(enddate)){
						//订单失效则修改订单时间失效表、订单表改状态
						RedeemManager redeemManage = (RedeemManager) ServiceLocator.getService("redeemManager");
						HashMap map = new HashMap();
						map.put("id", id);
						JmshtVO jvo1 = new JmshtVO();
						jvo1.setInputMap(map);
						redeemManage.updateIndianaTime(jvo1);
						list_indiana.remove(i);
					}else{
						break;
					}
				}
				Constant.list_indiana = list_indiana;
			}
			
			//订单失效时间及id
			Vector list_ordertime = Constant.list_ordertime;
			if(list_ordertime!=null&&!list_ordertime.isEmpty()){
				for(int i=0;i<list_ordertime.size();i++){
					Order_Invalid order_Invalid = (Order_Invalid)list_ordertime.get(i);
					String id = order_Invalid.getId()+"";
					Date enddate= order_Invalid.getEnddate();
					Date sysdate = new Date();
					if(sysdate.after(enddate)){
						//订单失效则修改订单时间失效表、商品加库存、订单表改状态
						RedeemManager redeemManage = (RedeemManager) ServiceLocator.getService("redeemManager");
						HashMap map = new HashMap();
						map.put("id", id);
						JmshtVO jvo = new JmshtVO();
						jvo.setInputMap(map);
						redeemManage.updateOrderTime(jvo);
						list_ordertime.remove(i);
					}else{
						break;
					}
				}
				Constant.list_ordertime = list_ordertime;
			}
			
			try {
				Thread.sleep(60000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

线程每分钟启动一次,为了避免每分钟查询数据库,定义一个并发容器作为全局变量,而我需要全局变量要存所有下单的商品信息和订单号,所以选择list的大哥Vector,并定义实体Order_Invalid,将数据存入实体,在将实体对象存入Vector。

public static Vector<Order_Invalid> list_ordertime = new Vector<Order_Invalid>();
//Order_Invalid  普通商品
public static Vector<Order_Invalid> list_indiana = new Vector<Order_Invalid>();
//Order_Invalid   一元夺宝
public static final int time = 2;

通过线程池提供的参数进行监控。线程池里有一些属性在监控线程池的时候可以使用

  • taskCount:线程池需要执行的任务数量。

  • completedTaskCount:线程池在运行过程中已完成的任务数量。小于或等于taskCount。

  • largestPoolSize:线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过。如等于线程池的最大大小,则表示线程池曾经满了。

  • getPoolSize:线程池的线程数量。如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不+ getActiveCount:获取活动的线程数。


展开阅读全文
打赏
1
12 收藏
分享
加载中
更多评论
打赏
0 评论
12 收藏
1
分享
返回顶部
顶部