package com;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
* Condition示例,生产线程生产字母,消费线程消费字母.
* @author Administrator
*
*/
public class ConditionDemo {
public static void main(String[] args) {
Shared s = new Shared();
new Producer(s).start();
new Consumer(s).start();
}
}
class Shared {
private char c;
private volatile boolean available = false;
private final ReentrantLock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
public ReentrantLock getLock() {
return lock;
}
public char getChar() {
lock.lock();
while (!available) {
try {
condition.await();
} catch (InterruptedException e) {}
}
char tmp = c;
available = false;
condition.signal();
lock.unlock();
return tmp;
}
public void setChar(char c) {
lock.lock();
try {
while (available) {
try {
condition.await();
} catch (InterruptedException e) {
}
}
this.c = c;
available = true;
condition.signal();
} finally {
lock.unlock();
}
}
}
class Producer extends Thread {
private final Shared s;
private final ReentrantLock lock;
Producer(Shared s) {
this.s = s;
this.lock = s.getLock();
}
@Override
public void run() {
for (char ch = 'A'; ch <= 'Z'; ch++) {
lock.lock();
s.setChar(ch);
System.out.println(ch + ",produced by producer.");
lock.unlock();
}
}
}
class Consumer extends Thread {
private final Shared s;
private final ReentrantLock lock;
Consumer(Shared s) {
this.s = s;
this.lock = s.getLock();
}
@Override
public void run() {
char ch;
do {
lock.lock();
ch = s.getChar();
System.out.println(ch + ",consumed by consumer.");
lock.unlock();
} while (ch != 'Z');
}
}
运行结果
A,produced by producer.
A,consumed by consumer.
B,produced by producer.
B,consumed by consumer.
C,produced by producer.
C,consumed by consumer.
D,produced by producer.
D,consumed by consumer.
E,produced by producer.
E,consumed by consumer.
F,produced by producer.
F,consumed by consumer.
G,produced by producer.
G,consumed by consumer.
H,produced by producer.
H,consumed by consumer.
I,produced by producer.
I,consumed by consumer.
J,produced by producer.
J,consumed by consumer.
K,produced by producer.
K,consumed by consumer.
L,produced by producer.
L,consumed by consumer.
M,produced by producer.
M,consumed by consumer.
N,produced by producer.
N,consumed by consumer.
O,produced by producer.
O,consumed by consumer.
P,produced by producer.
P,consumed by consumer.
Q,produced by producer.
Q,consumed by consumer.
R,produced by producer.
R,consumed by consumer.
S,produced by producer.
S,consumed by consumer.
T,produced by producer.
T,consumed by consumer.
U,produced by producer.
U,consumed by consumer.
V,produced by producer.
V,consumed by consumer.
W,produced by producer.
W,consumed by consumer.
X,produced by producer.
X,consumed by consumer.
Y,produced by producer.
Y,consumed by consumer.
Z,produced by producer.
Z,consumed by consumer.