62,621
社区成员
发帖
与我相关
我的任务
分享
package com.duanqu.manager.service.user;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.weaver.ast.And;
import com.duanqu.common.model.MessageModel;
import com.duanqu.manager.dao.UserAdminMapper;
import com.duanqu.redis.service.syn.message.IMessageSynService;
public class ThreadSendMessage {
Log logger = LogFactory.getLog(ThreadSendMessage.class);
long num;
UserAdminMapper userAdminMapper;
IMessageSynService messageSynService;
String messageText;
BlockingQueue<Long> blockingQueue = new LinkedBlockingQueue<Long>(2000);
final int pageSize=1000;
long logNum;
public void send() {
//借用线程池
ExecutorService service = Executors.newCachedThreadPool();
//生产者
Producer producer=new Producer();
//消费者
Consumer consumer=new Consumer();
Consumer consumer2=new Consumer();
Consumer consumer3=new Consumer();
Consumer consumer4=new Consumer();
Consumer consumer5=new Consumer();
Consumer consumer6=new Consumer();
service.execute(producer);
service.execute(consumer);
service.execute(consumer2);
service.execute(consumer3);
service.execute(consumer4);
service.execute(consumer5);
service.execute(consumer6);
}
public ThreadSendMessage(long num, UserAdminMapper userAdminMapper,
IMessageSynService messageSynService, String messageText) {
this.num = num;
this.userAdminMapper = userAdminMapper;
this.messageSynService = messageSynService;
this.messageText = messageText;
}
// 消费者线程
class Consumer implements Runnable {
Long recUid;
@Override
public void run() {
while(true){
try {
/*if(blockingQueue.size()<1000){
notifyAll();
}*/
recUid=blockingQueue.poll();
if(recUid!=null){
MessageModel mm = new MessageModel();
mm.setUid(1);
mm.setMessageText(messageText);
mm.setRecUid(recUid);
mm.setCreateTime(System.currentTimeMillis());
messageSynService.synMessageSend(mm);
logNum++;
System.out.println(logNum);
if(logNum==5000){
System.out.println("已经发送了五千用户=========================");
}
if(logNum==1000){
System.out.println("已经发送了1千用户=========================");
}
if(logNum==500){
System.out.println("已经发送了500用户=========================");
}
if(logNum==2000){
System.out.println("已经发送了2千用户=========================");
}
}
} catch (Exception e) {
logger.error("发送消息失败的用户ID:"+recUid);
e.printStackTrace();
}
}
}
}
//生产者线程
class Producer implements Runnable {
@Override
public void run() {
while(true){
/*if(blockingQueue.size()>1000){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}*/
if(num>0){
Map<String, Object> map=new HashMap<String, Object>();
map.put("pageStart", (num-1)*pageSize);
map.put("pageSize", pageSize);
List<Long> list=userAdminMapper.getUserList(map);
blockingQueue.addAll(list);
num--;
}
}
}
}
}