简单的线程池使用
1.这里以消息发送为例子来定义,该线程的启动则是为了发送消息。
public class MessageSendEntity implements Runnable {
private String userid;
private String username;
private SendInfo sendInfo;
//消息发送类
private SMSSendManager sendmanaer = new SMSSendManager();
public MessageSendEntity(String userid, String username, SendInfo sendInfo) {
super();
this.userid = userid;
this.username = username;
this.sendInfo = sendInfo;
}
public void run() {
//简单的消息发送方法
sendmanaer.send(userid, username, sendInfo);
}
}
2.设计一个类来存放唯一的messageQueue,将messageQueue传入MessageSendThread类来启动线程,执行反复监听messageQueue。
public class MessageSendThreadService {
//需要发送的 实体存入list放入队列
private static ConcurrentLinkedQueue<List> messageQueue = new ConcurrentLinkedQueue<List>();
private static MessageSendThreadService instance = null;
private MessageSendThreadService(){}
static{
//将队列传入 MessageSendThread 线程
Thread thread = new MessageSendThread(messageQueue);
thread.setName("SMS message send thread");
thread.start();
}
public static MessageSendThreadService getInstance(){
if(instance == null){
synchronized (MessageSendThreadService.class) {
if(instance == null){
instance = new MessageSendThreadService();
return instance;
}
}
}
return instance;
}
//将需要做事的参数构造为合适的泛型,传入 messageQueue
public void addSMSEntity(String userid,String username,SendInfo sendInfo) {
List list = new ArrayList();
list.add(userid);
list.add(username);
list.add(sendInfo);
messageQueue.add(list);
}
}
3.将队列传入线程中,线程的成员变量赋值为传入的队列,当MessageSendThreadService 调用addSMSEntity方法的时候,则MessageSendThread线程也会监听到队列中增加元素。
public class MessageSendThread extends Thread {
private ConcurrentLinkedQueue<List> messageQueue;
private ThreadPoolExecutor executor;
public MessageSendThread(ConcurrentLinkedQueue messageQueue){
//获取上一步传入的队列,并赋值给当先的成员变量队列
this.messageQueue = messageQueue;
/**
* 创建 无界 线程池
*/
int minSize=5;
int maxSize=20;
BlockingQueue<Runnable> queue = new LinkedBlockingDeque<Runnable>();
executor = new ThreadPoolExecutor(minSize, maxSize, 1, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.CallerRunsPolicy());
}
@Override
public void run() {
while(true){
try {
List list = messageQueue.poll();
if(list == null)
continue;
//如果 messageQueue 队列里 头元素不为null 则调用逻辑,并构造MessageSendEntity
//将线程MessageSendEntity 放入线程池并处理
String userid = (String)list.get(0);
String username = (String)list.get(1);
SendInfo sendInfo = (SendInfo)list.get(2);
Runnable entity = new MessageSendEntity(userid,username,sendInfo);
executor.execute(entity);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
在启动项目的时候加载MessageSendThread线程,调用方法为MessageSendThreadService.getInstance().addSMSEntity(“userid”, “username”, new SendInfo(“11”,“22”,“33”));
每次调用addSMSEntity方法,则在队列中加入一个list,由MessageSendThread监听队列是否新加值,若新加,则向线程池提交任务并处理。