package ThreadTest;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class R{
int size = 5;
List<Integer> list = new ArrayList<>();
}
class PP{
Lock lock;
Condition c;
R r;
public PP(Lock lock, Condition c, R r){
this.lock = lock;
this.c = c;
this.r = r;
}
public void produce(){
lock.lock();
while(r.list.size() >= r.size){
try {
c.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
r.list.add(1);
System.out.println("produce");
c.signalAll();
lock.unlock();
}
}
class CC{
Lock lock;
Condition c;
R r;
public CC(Lock lock, Condition c, R r){
this.lock = lock;
this.c = c;
this.r = r;
}
public void consume(){
lock.lock();
while(r.list.size() < 1){
try {
c.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
r.list.remove(0);
System.out.println("consume");
c.signalAll();
lock.unlock();
}
}
public class Case6 {
public static void main(String[] args) {
R r = new R();
Lock lock = new ReentrantLock();
PP ppp = new PP(lock, lock.newCondition(), r);
CC ccc = new CC(lock, lock.newCondition(), r);
List<Thread> p = new ArrayList<>();
List<Thread> c = new ArrayList<>();
for(int i = 0; i < 100; i++){
p.add(new Thread(new Runnable(){
@Override
public void run() {
ppp.produce();
}}));
}
for(int i = 0; i < 100; i++){
c.add(new Thread(new Runnable(){
@Override
public void run() {
ccc.consume();
}}));
}
for(int i = 0; i < 100; i++){
p.get(i).start();
c.get(i).start();
}
}
}
【Java】重入锁 生产者消费者
最新推荐文章于 2021-03-14 13:38:16 发布