package bq;
import java.util.LinkedList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class BlockingQueue<E> {
private LinkedList<E> list = new LinkedList<>();
public void push(E e) {
synchronized (list) {
list.add(e);
System.out.println(Thread.currentThread() + ", produce, " + e);
list.notifyAll();
}
};
public E poll() {
synchronized (list) {
while (list.size() == 0) {
System.out.println(Thread.currentThread() + ", poll:size=0, ");
try {
list.wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
E e = list.remove();
System.out.println(Thread.currentThread() + ", consume, " + e);
return e;
}
};
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
BlockingQueue<Integer> queue = new BlockingQueue<>();
exec.execute(new Consumer<>(queue));
exec.execute(new Producer<>(queue, 1));
exec.execute(new Consumer<>(queue));
exec.execute(new Producer<>(queue, 2));
exec.execute(new Consumer<>(queue));
exec.execute(new Producer<>(queue, 3));
}
}
class Consumer<E> implements Runnable {
private BlockingQueue<E> queue;
public Consumer(BlockingQueue<E> queue) {
this.queue = queue;
}
@SuppressWarnings("unused")
@Override
public void run() {
E e = queue.poll();
}
}
class Producer<E> implements Runnable {
private BlockingQueue<E> queue;
private E e;
public Producer(BlockingQueue<E> queue, E e) {
this.queue = queue;
this.e = e;
}
@Override
public void run() {
queue.push(e);
}
}
阻塞队列自定义实现 in Java
最新推荐文章于 2024-05-05 21:56:51 发布