java 多线程资源占用高

OS小小小 发布于 2016/06/17 15:39
阅读 1K+
收藏 4

【深圳】源创会:5.26下午、轰趴馆等你”


项目背景:

cmpp2 多线程发送短信,每秒200-400提交速率(可控制),也可控制线程数如:十个线程执行发送,那么每个线程的发送数=200/10(/秒)

技术实现:

1、使用一个主线程 在启动时候  创建 4个 LinkedBlockingQueue、分别来 管理和执行  抓取待发送数据、存入发送后数据、存入回执数据、存入回复数据。

2、在主线程启动时候 会 使用newFixedThreadPool(threadNum) 线程池 ,for (threadNum ) 来submit 发送线程,在发送线程里面 使用 while(true) 执行发送任务,出错重连、时间速率控制。

问题:

1、cpu 使用率太高,一直95% 、这才一个通道 一个协议 如果 接入 上百个都开多线程的话,不敢想。

2、如果 去掉while(true) 死循环 cpu使用率应该可以下降不少、但是无法保证 速率/时间、以及重连的时间及时性。

代码:

主线程:

随系统启动...


cmpp2= Executors.newFixedThreadPool(threadNum);
        for (int i = 1; i <= threadNum; i++)
        {
            threadTime.put("cmpp2Td"+i+"time", "");//String.valueOf(System.currentTimeMillis()));
            threadTime.put("cmpp2Td"+i+"num", String.valueOf(singleRate));
            SendMsgByCmpp2DBService s = new SendMsgByCmpp2DBService(sms,"cmpp2Td"+i,smsSendRecordService);
            s.speed = singleRate;
//            s.start();
            map.put("cmpp2_"+i, s);
           cmpp2.submit(s);
        }



任务线程:

public void run()
    {
        
        smsRecord = new SmsSendRecord();
        interval = interval/Rate;
        speed = Rate;
        while (true)
        {
            if (!this.is_login)
            {
              
                this.login();
               SendMsgCMPP2ThredPoolByDB. is_popData = false;
                continue;
            }
            if(this.smp.getConnState()!= null){
                SendMsgCMPP2ThredPoolByDB. is_popData = false;
                continue;
            }
            if(!SendMsgCMPP2ThredPoolByDB. is_popData)
            SendMsgCMPP2ThredPoolByDB. is_popData = true;
          
            
           
            
          
               
                currentTime = System.currentTimeMillis();
                
                tCurrentTime = System.currentTimeMillis(); 
                int currentTimeMinutes = new Date(tCurrentTime).getMinutes();
                int lastTimeMinutes = new Date(tLastTime).getMinutes();
                
                if ((tCurrentTime-tLastTime)>=1000 || currentTimeMinutes != lastTimeMinutes){
                    tCount = 0;
                    tLastTime=tCurrentTime;
                } else {
                    if (tCount >= speed) {
                        continue;
                    }
                }
                
                if (tCount <= speed) {
                    tCount++;
                    map =(Map)JSONObject.parse(SendMsgCMPP2ThredPoolByDB.ZhangYi.poll());
                    
                    
                    if (map == null){
                        continue;
                    }
                    if(map.get("DestTerminalID")==null||map.get("SrcTerminalID")==null||map.get("BatchNo")==null||map.get("ExpandNo") == null ||map.get("Priority") == null ||map.get("MsgContent") == null)
                        continue;
                    smsRecord.setPhone(map.get("DestTerminalID").toString());
                    smsRecord.setShow_phone(map.get("SrcTerminalID").toString());
                    smsRecord.setSub_no(map.get("BatchNo").toString());
                    smsRecord.setCustomer_name(map.get("ExpandNo").toString());
                    smsRecord.setChannel_name(map.get("Priority").toString());
                    smsRecord.setContent(map.get("MsgContent").toString());
                    smsRecord.setCreate_date(new Date(tLastTime));
                      this.sendMsg(smsRecord);
                } else {
                    tLastTime=currentTime;
                }
                initCount++;
            
            
  
            
            
            
            
            
            
            
            
        }
    
    }



请各大神解惑、指出待优化点/////////万分感谢!!


加载中
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部