线程池的使用

简单的线程池使用

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监听队列是否新加值,若新加,则向线程池提交任务并处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值