Condition

1. 使用Condition实现等待通知机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class ConTest {

final Lock lock = new ReentrantLock();
final Condition condition = lock.newCondition();

public static void main(String[] args) {
// TODO Auto-generated method stub
ConTest test = new ConTest();
Producer producer = test.new Producer();
Consumer consumer = test.new Consumer();
consumer.start();
producer.start();
}

class Consumer extends Thread{

@Override
public void run() {
consume();
}

private void consume() {
try {
lock.lock();
System.out.println("我在等一个新信号" + Thread.currentThread().getName());
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
// TODO Auto-generated catch block
} finally{
System.out.println("拿到一个信号" + Thread.currentThread().getName());
lock.unlock();
}
}
}

class Producer extends Thread{

@Override
public void run() {
produce();
}

private void produce() {
lock.lock();
try {
System.out.println("我拿到锁" + Thread.currentThread().getName());
condition.signalAll();
System.out.println("我发出了一个信号:" + Thread.currentThread().getName());
} finally{
lock.unlock();
}
}
}
}
运行结果

我在等一个新信号Thread-1
我拿到锁Thread-0
我发出了一个信号:Thread-0
拿到一个信号Thread-1

2. 使用Condition实现生产者、消费者模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public class ConTest2 {
private int queueSize = 10;
private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize);
private Lock lock = new ReentrantLock();
private Condition notFull = lock.newCondition();
private Condition notEmpty = lock.newCondition();

public static void main(String[] args) throws InterruptedException {
ConTest2 test = new ConTest2();
Producer producer = test.new Producer();
Consumer consumer = test.new Consumer();
producer.start();
consumer.start();
Thread.sleep(0);
producer.interrupt();
consumer.interrupt();
}

class Consumer extends Thread{
@Override
public void run() {
consume();
}

volatile boolean flag=true;

private void consume() {
while(flag){
lock.lock();
try {
while(queue.isEmpty()){
try {
System.out.println("队列空,等待数据");
notEmpty.await();
} catch (InterruptedException e) {
flag = false;
}
}

//每次移走队首元素
queue.poll();
notFull.signal();
System.out.println("从队列取走一个元素,队列剩余" + queue.size()+"个元素");
} finally{
lock.unlock();
}
}
}
}

class Producer extends Thread{

@Override
public void run() {
produce();
}

volatile boolean flag=true;

private void produce() {
while(flag){
lock.lock();
try {
while(queue.size() == queueSize){
try {
System.out.println("队列满,等待有空余空间");
notFull.await();
} catch (InterruptedException e) {
flag = false;
}
}

//每次插入一个元素
queue.offer(1);
notEmpty.signal();
System.out.println("向队列取中插入一个元素,队列剩余空间:"+(queueSize-queue.size()));
} finally{
lock.unlock();
}
}
}
}

}

运行结果

向队列取中插入一个元素,队列剩余空间:9
向队列取中插入一个元素,队列剩余空间:8
向队列取中插入一个元素,队列剩余空间:7
向队列取中插入一个元素,队列剩余空间:6
向队列取中插入一个元素,队列剩余空间:5
向队列取中插入一个元素,队列剩余空间:4
向队列取中插入一个元素,队列剩余空间:3
向队列取中插入一个元素,队列剩余空间:2
向队列取中插入一个元素,队列剩余空间:1
向队列取中插入一个元素,队列剩余空间:0
队列满,等待有空余空间
队列满,等待有空余空间
从队列取走一个元素,队列剩余9个元素
从队列取走一个元素,队列剩余8个元素
从队列取走一个元素,队列剩余7个元素
从队列取走一个元素,队列剩余6个元素
从队列取走一个元素,队列剩余5个元素
从队列取走一个元素,队列剩余4个元素
从队列取走一个元素,队列剩余3个元素
从队列取走一个元素,队列剩余2个元素
从队列取走一个元素,队列剩余1个元素
从队列取走一个元素,队列剩余0个元素
队列空,等待数据
队列空,等待数据
向队列取中插入一个元素,队列剩余空间:9
从队列取走一个元素,队列剩余0个元素


本站由 卡卡龙 使用 Stellar 1.29.1主题创建

本站访问量 次. 本文阅读量 次.