接下来的几篇博客会介绍下juc包下的相关数据结构
包含queue,list,map等
这篇文章主要模拟下阻塞队列。
下面是代码
import java.util.LinkedList; import java.util.concurrent.atomic.AtomicInteger; public class MyBlockingQueue<T> { private final LinkedList<T> queue = new LinkedList<>(); private final AtomicInteger size = new AtomicInteger(0); private final Object lock = new Object(); private final int maxSize ; public MyBlockingQueue(int maxSize) { this.maxSize = maxSize; } public void add(T t) { synchronized (lock) { while (size.get() == maxSize) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } queue.add(t); size.incrementAndGet(); lock.notifyAll(); } } public T poll() { T result = null; synchronized (lock) { while (size.get() == 0) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } result = queue.removeFirst(); size.decrementAndGet(); lock.notifyAll(); } return result; } public int getSize() { return size.get(); } public static void main(String[] args) { final MyBlockingQueue<String> queue = new MyBlockingQueue<>(1); Thread t1 = new Thread(new Runnable() { @Override public void run() { queue.add("h"); queue.add("j"); queue.add("h1"); queue.add("j1"); queue.add("h2"); queue.add("j2"); } }, "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { try { while(true) { Thread.sleep(1000); System.out.println("t2取走的元素为:" + queue.poll()); } } catch (InterruptedException e) { e.printStackTrace(); } } }, "t2"); Thread t3 = new Thread(new Runnable() { @Override public void run() { try { while(true) { Thread.sleep(1000); System.out.println("t3取走的元素为:" + queue.poll()); } } catch (InterruptedException e) { e.printStackTrace(); } } }, "t3"); t1.start(); t2.start(); t3.start(); } }