共享队列ShareQueue
来源:互联网 发布:外星人windows hello 编辑:程序博客网 时间:2024/06/11 06:42
public class SharedQueue {class Node {Object task;Node next;Node(Object task) {this.task = task;next = null;}}private Node head = new Node(null);private Node last = head;private volatile int w;private Object putLock = new Object();private Object takeLock = new Object();public void put(Object task) {System.out.println("...... " + Thread.currentThread().getName() + " wants to get the putLock....");synchronized (putLock) {System.out.println("...... " + Thread.currentThread().getName() + " gets putLock....");Node p = new Node(task);last.next = p;last = p;System.out.println("...... putting "+ task);if (w > 0) {System.out.println("...... w = " + w);putLock.notify();}}}public Object take() {Object task = null;System.out.println(Thread.currentThread().getName() + " wants to get the takeLock....");synchronized (takeLock) {System.out.println(Thread.currentThread().getName() + " gets takeLock....");while (isEmpty()) {try {System.out.println(Thread.currentThread().getName() + " want to get putLock....");synchronized (putLock) {System.out.println(Thread.currentThread().getName() + " gets putLock....");w++;putLock.wait();w--;}} catch (Exception e) {// TODO: handle exception}}{Node first = head.next;task = first.task;first.task = null;head = first;}}System.out.println(Thread.currentThread().getName() + " releases takeLock....");return task;}private boolean isEmpty() {return head.next == null;}public static void main(String[] args) {final SharedQueue queue = new SharedQueue();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {queue.put(Integer.valueOf(i));try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("============taking " + queue.take());}}}).start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("----------------taking " + queue.take());}}}).start();}}
0 0
- 共享队列ShareQueue
- 共享队列和双队列
- Linux--共享队列1
- Linux--共享队列2
- [LDD3速记]_tasklet、工作队列、共享队列
- 信号量 消息队列 共享内存
- 管道/消息队列/共享内存
- IPC通信之共享队列
- 共享栈与循环队列
- 信号量、消息队列、共享内存
- 共享内存队列的实现
- LINUX CAS共享内存队列
- 【例子】线程安全的共享缓冲队列
- linux 共享内存 消息队列 udp通信
- Linux 内存共享与消息队列
- 第四课 共享内存和消息队列
- 信号机制、共享内存和消息队列
- 信号机制、共享内存和消息队列
- 小白书之栈的调用过程
- C# 、Vb .Net 中 Datagridview显示行号方法。
- Black Box(POJ--1442
- Codeforces 19D(线段树+离散化)
- 安卓百度地图附近poi搜索以及到指定poi的换乘方案
- 共享队列ShareQueue
- hdu-5025 Saving Tang Monk (BFS + 状态压缩)
- php最简单的注入与最简单的避免方式
- 【OpenCV】高斯混合背景建模
- Codeforces 432C Prime Swaps
- 2015.8.14工作总结
- C# DataGridView显示行号方法。
- win共享文件给xp系统
- Derivation of User Browsing Model