本文共 2997 字,大约阅读时间需要 9 分钟。
package org.poi;import java.util.Stack;public class BlockQueue{ // push的锁 private final static Object pushLock = new Object(); // pop的锁 private final static Object popLock = new Object(); // 存储数据 private Stack stack; public BlockQueue() { stack = new Stack<>(); } public synchronized void push(T t) { int MAX_SIZE = 3; if (stack.size() >= MAX_SIZE) { // 超过了最大长度,那么就等待 System.out.println("wait"); pushLock(); } System.out.println("push"); stack.push(t); System.out.println(stack.size()); // 解开pop的锁 popUnlock(); } public T pop() { System.out.println("pop"); if (stack.size() == 0) { // 不能pop,那么就等待 popLock(); } T t = stack.pop(); // 解开push的锁 pushUnlock(); return t; } // push锁 private void pushLock() { synchronized (pushLock) { System.out.println("pushLock"); try { pushLock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } // 解开push锁 private void pushUnlock() { synchronized (pushLock) { System.out.println("pushUnlock"); pushLock.notify(); } } // pop锁 private void popLock() { synchronized (popLock) { try { popLock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } // 解开pop锁 private void popUnlock() { synchronized (popLock) { System.out.println("popUnlock"); popLock.notify(); } } public static void main(String[] args) { BlockQueue blockQueue = new BlockQueue(); blockQueue.push("1"); blockQueue.push("2"); blockQueue.push("3"); blockQueue.push("4"); Thread thread1 = new Thread(); Thread thread2 = new Thread(); Thread thread3 = new Thread(); thread1.start(); }}
package org.poi;public class ThreadDemo extends Thread { BlockQueuequeue; public ThreadDemo(BlockQueue queue) { this.queue = queue; } int i = 1; @Override public void run() { queue.push(i++ +""); try { sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } queue.pop(); } public static void main(String[] args) { BlockQueue queue = new BlockQueue<>(); ThreadDemo demo1 = new ThreadDemo(queue); demo1.setName("t-1"); ThreadDemo demo2 = new ThreadDemo(queue); demo2.setName("t-2"); ThreadDemo demo3 = new ThreadDemo(queue); demo3.setName("t-3"); ThreadDemo demo4 = new ThreadDemo(queue); demo4.setName("t-4"); demo1.start(); demo2.start(); demo3.start(); demo4.start(); }}
转载地址:http://xatmi.baihongyu.com/