return stack2.peek(); } } public static void main(String[] args) { myQueue mQueue = new myQueue(); mQueue.add(1); mQueue.add(2); mQueue.add(3); System.out.println (mQueue.peek()); System.out.println(mQueue.poll()); System.out.println(mQueue.peek()) ; System.out.println(mQueue.poll()); System.out.println(mQueue.peek()); System.out.println (mQueue.poll()); } }
looper.queue }else{ // 反射获取 MessageQueue 消息队列 // 设置访问字段 var mQueue = Looper::class.java.getDeclaredField("mQueue") // 设置允许访问 mQueue.isAccessible = true messageQueue = mQueue.get(looper) as MessageQueue } 四、HandlerThread 获取 Handler = Looper::class.java.getDeclaredField("mQueue") // 设置允许访问 mQueue.isAccessible = true messageQueue = mQueue.get(looper) as MessageQueue } // 4 .
当然大家也可以直接使用gcc -lrt -lpthread来解决这个问题,然后我们对程序编译并测试: [zorro@zorro-pc mqueue]$ rm send [zorro@zorro-pc mqueue /send zorro 1 [zorro@zorro-pc mqueue]$ ./send shrek 2 [zorro@zorro-pc mqueue]$ . /send jerry 3 [zorro@zorro-pc mqueue]$ ./send zzzzz 1 [zorro@zorro-pc mqueue]$ . 然后我们可以通过文件来查看相关消息队列的状态: [zorro@zorro-pc mqueue]$ cat /dev/mqueue/mqtest QSIZE:31 NOTIFY:0 我们先来看使用信号的简单例子: [zorro@zorro-pc mqueue]$ cat notify_sig.c #include <pthread.h> #include <mqueue.h> #include
BlockingQueue例子让大家印象深刻一点: 用wait,notify,notifyAll实现: public class BlockingQueue<T> { private Queue<T> mQueue () == mCapacity){ wait(); } mQueue.add(element); notify(); } public synchronized T take() throws InterruptedException{ while (mQueue.isEmpty()){ wait(); } T item = mQueue.remove(); notify(); return item; } } 用 await,signal,signalAll实现: public class BlockingQueue<T> { private Queue<T> mQueue = new LinkedList
/// /// <typeparam name="T">消息队列存储的消息对象类型</typeparam> public sealed class MQueue<T> : IDisposable , IMessageSender<T>, IMessageReceiver<T> { public MQueue(MessageQueue mq, string user = "Everyone /// <typeparam name="T">消息队列存储的消息对象类型</typeparam> /// <returns></returns> public static MQueue [key] == null)) { httpContext.Cache[key] = new MQueue<T>(mq); } return httpContext.Cache[key] as MQueue<T>; } return new MQueue<T>(mq,user
Looper Looper looper = Looper.looper(); // 获取封装在 Looper 中的 消息队列 MessageQueue mQueue = looper.mQueue; } 三、完整 Handler 代码 ---- package kim.hsl.handler; public class Handler { /* * * 消息队列 * 该消息队列封装在 Looper 中 * Looper 封装在线程本地变量中 */ MessageQueue mQueue; Looper Looper looper = Looper.looper(); // 获取封装在 Looper 中的 消息队列 MessageQueue mQueue = looper.mQueue; } /** * 发送消息 * @param msg */ public void sendMessage(Message
Handler mWorkHandler,mUiHandler; private boolean isDestroy; private PriorityQueue<Message> mQueue { if(msg.what == -1) { if (mQueue false; return; } msg = mQueue.poll == null) { mQueue = new PriorityQueue<Message> message = Message.obtain(); message.copyFrom(msg); mQueue.add
mQueue提供了消息发送到各个消息队列的方法,通过mQueue.get("...")选取消息队列,然后执行messagequeue的四种方法(sendUrl, sendPage, sendResult mQueue使用同上。 mQueue的使用同上。 4. Freeman: 通过上述的三个流程,可以实现爬虫抓取的一个正常流程。但是jlitespider同样提供了自定义的功能,你可以完善,加强,改进甚至颠覆上述的抓取流程。 同样,通过mQueue的send方法,可以实现向消息队列发送自定义消息的操作。(需要注意,自定义的消息标记不能为:url,page,result。 ; //因为下载失败,所以将url重新放入main队列中 mQueue.get("main").sendUrl(url); } } } //解析页面数据,将结果放入main消息队列。
8192 simba@ubuntu:~/Documents/code/linux_programming/UNP/posix$ cat /proc/sys/fs/mqueue/queues_max 还有一点是,在Linux上,posix 消息队列是以虚拟文件系统实现的,必须将其挂载到某个目录才能看见,如 # mkdir /dev/mqueue # mount -t mqueue none /dev/mqueue 通过cat 命令查看消息队列的状态,假设mymq 是创建的一条消息队列的名字 $ cat /dev/mqueue /mq_open 用mq_open 创建了一个消息队列并mount 到/dev/mqueue 上,可以查看状态: simba@ubuntu:/dev/mqueue$ cat /dev/mqueue/abc /mq_notify 再查看状态: simba@ubuntu:/dev/mqueue$ cat /dev/mqueue/abc QSIZE:0 NOTIFY:0 SIGNO
是否太多 bool tooManyBuffers = mCore->mQueue.size()> static_cast<size_t>(maxBufferCount); if 入队mQueue if (mCore->mQueue.empty()) { mCore->mQueue.push_back(item); 如果队列为空,则直接返回 if (mCore->mQueue.empty()) { return NO_BUFFER_AVAILABLE; } 取出mQueue队列的第一个元素,并从队列中移除 BufferQueueCore::Fifo::iterator front(mCore->mQueue.begin()); :Fifo::iterator current(mCore->mQueue.begin()); while (current !
public void enqueue(InflateRequest request) { try { mQueue.put(request); getInstance() { return sInstance; } private ArrayBlockingQueue<InflateRequest> mQueue } public void enqueue(InflateRequest request) { try { mQueue.put 队列中,如果元素过多那么是有排队机制的; runInner 函数; 运行于循环中,从 mQueue 队列取出元素; 调用 inflate 方法; 返回主线程; 此处提一个问题:runInner 运行于循环中 实际上不是的,mQueue 队列的类型是 ArrayBlockingQueue ,这是一个“生产者-消费者”的模型,如果队列中没有元素,那么 mQueue.take() 就会处于等待状态,直到 mQueue.put
5.2 mq_open、mq_close和mq_link函数 Mq_open函数创建一个新的消息队列或打开一个已存在的消息队列 #include<mqueue.h> mqd_t mq_open(const 1 oflag参数是O_RDONLY,O_WRONLY或O_RDWR之一,可能按位或上O_CREAT,O_EXCL或O_NONBLOCK 已打开的消息队列是由mq_close关闭的 #include<mqueue.h 只有当进程终止时才删除 要想删除mq_open的第一个参数name必须调用mq_link #include<mqueue.h> Int mq_unlink(const char *name); //返回:成功时为0,出错时为-1 5.3 mq_getattr和mq_setattr函数 #include<mqueue.h> int mq_getattr(mqd_t mqdes, struct mq_attr 这种通知有两种方式可供选择: 产生一个信号 创建一个线程执行一个指定函数 这种通知通过调用mq_notify建立 #include<mqueue.h> int mq_notify
Handler { /** * 消息队列 * 该消息队列封装在 Looper 中 * Looper 封装在线程本地变量中 */ MessageQueue mQueue Looper Looper looper = Looper.looper(); // 获取封装在 Looper 中的 消息队列 MessageQueue mQueue = looper.mQueue; } /** * 发送消息 * @param msg */ public void sendMessage(Message msg){ // 为消息设置发送的 Handler msg.target = this; // 向消息队列中放入要执行的消息 mQueue.enqueueMessage
quitAllowed)); } 默认情况下ThreadLocal是没有存储的,所以要创建一个新的looper private Looper(boolean quitAllowed) { mQueue image.gif 默认情况下ThreadLocal是没有存储的,所以要创建一个新的looper private Looper(boolean quitAllowed) { mQueue = mLooper.mQueue; mCallback = callback; mAsynchronous = async; } ? 的消息发送 public boolean sendMessageAtTime(Message msg, long uptimeMillis) { MessageQueue queue = mQueue ; Looper.prepare() wasn't called on this thread."); } final MessageQueue queue = me.mQueue
#include <mqueue.h> #include <fcntl.h> #include <sys/stat.h> mqd_t mq_open(const char *name, int oflag #include <mqueue.h> int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio) #include <mqueue.h> int mq_close(mqd_t mqdes);mqdes:消息队列描述符。返回值:成功时返回 0,失败时返回 -1 并设置 errno。 #include <mqueue.h> int mq_unlink(const char *name); name:消息队列的名称。 #include <mqueue.h> int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat); mqdes:消息队列描述符。
mCallback 成员变量 , 在该方法中 , 调用 mLooper = Looper.myLooper() 获取线程本地变量 Looper ; 获取 Looper 中的消息队列 MessageQueue , mQueue = mLooper.mQueue ; 主线程的 Looper 是在 ActivityThread 中的 main 函数 中 , 使用 Looper.prepareMainLooper() 创建的 , = mLooper.mQueue; mCallback = callback; mAsynchronous = async; } } Handler 中的 Callack boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) 方法 , 在该方法中 , 调用 MessageQueue queue = mQueue public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) { MessageQueue queue = mQueue
())这个时刻, 消息队列一新增消息, 即一接收到某个客户端发送过来消息(mQueue.put()), 则消息都会一次性转发给所有客户端, 所以这里涉及到一个观察者设计模式, 消息队列(MsgPool socket 通信; 类中: 1/3 构造方法: 接收TcpServer对过来的socket对象, 用之初始化其IO流; 2/3 run():<读取Client的 I流,加入 MsgPool.mQueue 在原地 3/3 onMsgComing(String msg):<取出 MsgPool.mQueue,写入Client的 O流> 作为消息队列的观察者对应的更新方法, 消息队列中最新的消息会推送通知到这里的 = new LinkedBlockingQueue<>(); sendMsg(String msg): 当有消息过来时,即客户端接收到消息时, 就把消息发送(添加)到消息队列中:mQueue.put ())这个时刻, 消息队列一新增消息, 即一接收到某个客户端发送过来消息(mQueue.put()), 则消息都会一次性转发给所有客户端, 所以这里涉及到一个观察者设计模式, 消息队列(MsgPool
Looper.looper(); // 从当前线程的 Looper 获取 消息队列 MessageQueue MessageQueue messageQueue = looper.mQueue ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>(); /** * 消息队列 */ public MessageQueue mQueue ; /** * Looper 构造函数 */ private Looper(){ mQueue = new MessageQueue(); Looper.looper(); // 从当前线程的 Looper 获取 消息队列 MessageQueue MessageQueue messageQueue = looper.mQueue
Looper Looper looper = Looper.looper(); // 获取封装在 Looper 中的 消息队列 MessageQueue mQueue = looper.mQueue; } 完整 Handler 代码 : package kim.hsl.handler; public class Handler { /** * 消息队列 * 该消息队列封装在 Looper 中 * Looper 封装在线程本地变量中 */ MessageQueue mQueue; public = looper.mQueue; } /** * 发送消息 * @param msg */ public void sendMessage(Message ; /** * Looper 构造函数 */ private Looper(){ mQueue = new MessageQueue();
ImageRequest,也是继承自Request的,因此它的用法也是基本相同的,首先需要获取到一个RequestQueue对象,可以调用如下方法获取到: RequestQueue mQueue = Volley.newRequestQueue imageView.setImageResource(R.drawable.default_image); } }); mQueue.add (imageRequest); //将imageRequest对象添加到mQueue运行 ---- 二. ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() { @Override public void url, bitmap); } } 这里我们将缓存图片的大小设置为10M, 然后将第二个步骤改为: ImageLoader imageLoader = new ImageLoader(mQueue