一、手写一个阻塞队列
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class MyLinkedBlockingQueue<E> {
ReentrantLock lock = new ReentrantLock();
Condition put = lock.newCondition();
Condition take = lock.newCondition();
public LinkedList<E> queue ;
private int count = 0 ;
private int capacity ;
public MyLinkedBlockingQueue() {
this(Integer.MAX_VALUE);
queue = new LinkedList<E>();
}
public MyLinkedBlockingQueue(int capacity){
this.capacity = capacity ;
queue = new LinkedList<E>();
}
public void put(E e) throws InterruptedException {
lock.lock();
try {
while (count == capacity) {
put.await(); //阻塞队列已满,等待
}
queue.add(e);
System.out.println("生产者生产了第"+e+"个") ;
count++ ;
take.signal();
} finally {
lock.unlock();
}
}
public E take() throws InterruptedException {
lock.lock();
try {
while (count == 0) {// 队列为空,阻塞
take.await();
}
E e = queue.pop();
System.out.println("消费者消费了第"+e+"个");
count-- ;
put.signal() ;
return e ;
} finally {
lock.unlock();
}
}
}
二、手写生产者和消费者
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
import org.junit.Test;
public class MyConsumer_Producer {
MyLinkedBlockingQueue<Integer> bQueue = new MyLinkedBlockingQueue<Integer>(5);
ReentrantLock lock = new ReentrantLock();
AtomicInteger count = new AtomicInteger(1);
public void set () {
Integer s =count.getAndAdd(1);
try {
bQueue.put(s);
}catch (InterruptedException e){
e.printStackTrace();
}
}
public void out() {
try {
Integer s = bQueue.take();
}catch (InterruptedException e) {
e.printStackTrace();
}
}
@Test
public void fun() {
//生产者线程
new Thread( new Runnable() {
public void run() {
while(true) {
set();
}
}
},"111").start();
//消费者线程
new Thread( new Runnable() {
public void run() {
while(true) {
out();
}
}
},"222").start();
}
}