简单的线程池管理多线程
2016-04-15 00:00
357 查看
摘要: 公司要写订单失效时间,30分钟不付款就修改订单为无效订单并将商品库存加回来,并且加上上次那个线程,加个线程池。
随tomcat启动的servlet来启动线程
上个线程在前几个博客,这个线程用来付款时间超过30分钟就修改订单状态并将商品库存和销售量修改回来
线程每分钟启动一次,为了避免每分钟查询数据库,定义一个并发容器作为全局变量,而我需要全局变量要存所有下单的商品信息和订单号,所以选择list的大哥Vector,并定义实体Order_Invalid,将数据存入实体,在将实体对象存入Vector。
通过线程池提供的参数进行监控。线程池里有一些属性在监控线程池的时候可以使用
taskCount:线程池需要执行的任务数量。
completedTaskCount:线程池在运行过程中已完成的任务数量。小于或等于taskCount。
largestPoolSize:线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过。如等于线程池的最大大小,则表示线程池曾经满了。
getPoolSize:线程池的线程数量。如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不+ getActiveCount:获取活动的线程数。
随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& 3ff0 nbsp;= 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:获取活动的线程数。
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题
- C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
- C#控制台下测试多线程的方法
- 21天学习android开发教程之SurfaceView与多线程的混搭
- Ruby 多线程的潜力和弱点分析
- c++线程池实现方法
- C++ Vector用法详解