使用优先队列PriorityBlockingQueue进行消息调度
来源:互联网 发布:再也没有 知乎 编辑:程序博客网 时间:2024/06/06 09:20
import java.util.concurrent.*;import java.util.concurrent.atomic.AtomicBoolean;/** * Created by zhenweiyu on 2017/5/19. */public class MsgQueueDispatcher { private PriorityBlockingQueue<Runnable> mPriorityBlockingQueue; private HandleThread mHandleThread; private static volatile MsgQueueDispatcher mInstance; private ExecutorService mMsgTaskExecutor; private AtomicBoolean mExit; private MsgQueueDispatcher(){ mPriorityBlockingQueue= new PriorityBlockingQueue<>(); mExit = new AtomicBoolean(false); mHandleThread = new HandleThread(); mMsgTaskExecutor = Executors.newFixedThreadPool(15); } public static MsgQueueDispatcher getInstance(){ if(mInstance == null){ synchronized (MsgQueueDispatcher.class){ if(mInstance==null){ mInstance = new MsgQueueDispatcher(); } } } return mInstance; } public void startDispatcher(){ if(mHandleThread!=null){ if(!mHandleThread.isInterrupted()){ mExit.set(true); mHandleThread.interrupt(); } mExit.set(false); mHandleThread.start(); } } public void stopDispatcher(){ mExit.set(true); if(mHandleThread!=null){ mHandleThread.interrupt(); } } public void sendMsg(MsgRunnable runnable){ if(mPriorityBlockingQueue!=null) { mPriorityBlockingQueue.offer(runnable); } } class HandleThread extends Thread{ public HandleThread(){ super(); } @Override public void run() { while (!mExit.get()){ if(mExit.get()){ break; } try { System.out.println("waiting for msg......"); Runnable runnable = mPriorityBlockingQueue.take(); if(runnable!=null){ System.out.println(String.format("------take msg %s level %d------", ((MsgRunnable)runnable).getContent(),((MsgRunnable)runnable).getLevel())); if(mMsgTaskExecutor!=null){ mMsgTaskExecutor.execute(runnable); } } } catch (InterruptedException e) { e.printStackTrace(); } } } } static class MsgRunnable implements Runnable,Comparable<MsgRunnable>{ private int level; private String content; public MsgRunnable(String content,int level){ this.content = content; this.level = level; } public int getLevel(){ return level; } public String getContent(){ return content; } @Override public int compareTo(MsgRunnable o) { if(this.level>o.level){ return -1; }else if(this.level<o.level){ return 1; } return 0; } @Override public void run() { try { System.out.println(String.format("sending msg %s,current level %d",content,level)); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }}
优先队列的操作对象必须实现Comparable接口,return -1 的表示优先级比较高
/** * Created by zhenweiyu on 2017/5/19. */public class MsgQueueDispatcherDemo { public static void main(String []args){ MsgQueueDispatcher msgQueueDispatcher = MsgQueueDispatcher.getInstance(); Thread thread = new Thread(new Runnable() { @Override public void run() { for(int i=0;i<20;i++){ MsgQueueDispatcher.MsgRunnable msgRunnable = new MsgQueueDispatcher. MsgRunnable(String.format("send msg %d",i),i); msgQueueDispatcher.sendMsg(msgRunnable); } } }); thread.start(); try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } msgQueueDispatcher.startDispatcher(); //msgQueueDispatcher.stopDispatcher(); }}
可以看到结果是level为19的msg是先被取出的,而level = 0的是最后被取出的,而与初始入队的顺序没有关系
阅读全文
0 0
- 使用优先队列PriorityBlockingQueue进行消息调度
- (十六)java多线程之优先队列PriorityBlockingQueue
- 使用优先队列在iOS中实现消息排序
- PriorityBlockingQueue 优先级阻塞队列的介绍和使用
- 优先级队列PriorityBlockingQueue
- 阻塞队列之PriorityBlockingQueue
- RabbitMQ消息队列(六):使用主题进行消息分发
- RabbitMQ消息队列(六):使用主题进行消息分发
- RabbitMQ消息队列(六):使用主题进行消息分发
- RabbitMQ消息队列(六):使用主题进行消息分发
- RabbitMQ消息队列(六):使用主题进行消息分发
- RabbitMQ消息队列(六):使用主题进行消息分发
- RabbitMQ消息队列(六):使用主题进行消息分发
- RabbitMQ消息队列(六):使用主题进行消息分发
- RabbitMQ消息队列(六):使用主题进行消息分发
- RabbitMQ消息队列(六):使用主题进行消息分发
- RabbitMQ消息队列(六):使用主题进行消息分发
- RabbitMQ消息队列(六):使用主题进行消息分发
- 数据结构与算法简记:线索化二叉树
- TeamTalk源码分析(九) —— 服务器端route_server源码分析
- jqzoom图片放大器代码
- error: Microsoft Visual C++ 9.0 is required
- 字符串练习
- 使用优先队列PriorityBlockingQueue进行消息调度
- localStorage对JSON对象类型需要转换
- PCM数据格式
- DOM-4 Element新增、修改、表单提交、定时器
- 字符串练习
- xmpp来回交换登录退出2个账号异常,还未解决
- web安全-xss漏洞的原理和解决方案
- Python自学之函数参数总结
- 51NOD 1625 夹克爷发红包 (贪心+dfs)