分享成果,欢迎指正。
package com.gannalyo.threadinterview;
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
// /**
// * 依据Lock和Condition实现高效阻塞队列(代替wait、notify、notifyAll)
// * 1.定义队列
// * 2.定义阻塞需要的Lock和Condition(put、take)
// * 3.编写put函数
// * 4.编写take函数
// * 5.编写main函数,启动两个线程,每个线程中for循环25次,1个put,1个take
// *
// * @author Gannalyo
// * @version 2018-03-27
// */
public class Condition阻塞队列 {
private static int limitCount = 10, contentCount = 0;
private static BlockingQueue<String> queue = new ArrayBlockingQueue<String>(limitCount);
private static Lock lock = new ReentrantLock();
private static Condition putCondition = lock.newCondition();
private static Condition takeCondition = lock.newCondition();
private void put() {
try {
lock.lock();
while (contentCount == limitCount) {
Thread.sleep(400);
System.out.println("队列已满,请稍等……我睡半秒");
Thread.sleep(100);
putCondition.await();
}
String content = new Random().nextInt(100) + "";
queue.put(content);
System.out.println("To put the value is [" + content + "].");
contentCount++;
takeCondition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
private void take() {
try {
lock.lock();
while (contentCount == 0) {
Thread.sleep(400);
System.err.println("队列空了,请添加……我睡半秒");
Thread.sleep(100);
takeCondition.await();
}
String content = queue.take();
System.err.println("To take the value is [" + content + "].");
contentCount--;
putCondition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
static Condition阻塞队列 conditionQueue = new Condition阻塞队列();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 25; i++) {
conditionQueue.put();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 25; i++) {
conditionQueue.take();
}
}
}).start();
}
}