public void testCondtion() {
final Lock lock = new ReentrantLock();
final Condition isEmpty = lock.newCondition();
final Condition isFull = lock.newCondition();
final List<Integer> list = new CopyOnWriteArrayList<Integer>();
final int listSize = 20;
ExecutorService putService = Executors.newCachedThreadPool();
for (int i = 0 ; i < 100; i ++) {
// System.out.println("放入");
putService.submit(
new Runnable() {
@Override
public void run() {
while (true) {
lock.lock();
try{
while (list.size() == listSize) {
try {
// System.out.println("满了");
isFull.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
TimeUnit.SECONDS.sleep(new Random(3).nextInt());
} catch (InterruptedException e) {
e.printStackTrace();
}
list.add(new Random().nextInt(1000));
isEmpty.signal();
} finally {
lock.unlock();
}
}
}
});
}
ExecutorService getService = Executors.newCachedThreadPool();
for (int i = 0 ; i < 10 ; i ++) {
// System.out.println("取出");
getService.submit(
new Runnable() {
@Override
public void run() {
while (true) {
lock.lock();
try{
while (list.isEmpty()) {
// System.out.println("空了");
try {
isEmpty.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
TimeUnit.SECONDS.sleep(new Random(3).nextInt());
} catch (InterruptedException e) {
e.printStackTrace();
}
list.remove(0);
isFull.signal();
} finally {
lock.unlock();
}
}
}
});
}
putService.shutdown();
getService.shutdown();
while (true) {
System.out.println(list.size() + " " + list.toString() );
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}