Lock裏的 new Condition()
會產生一個新的Condition(等待隊列)對象
- 利用
Condition
裏面的await()
和singnal
等待和喚醒自己隊列的線程,不會喚醒不該喚醒的線程
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 goods{
private String name;
private int count = 0;
private int maxCount;
public goods(int maxCount){
this.maxCount = maxCount;
}
private Lock lock = new ReentrantLock();
private Condition producer = lock.newCondition();
private Condition consumer = lock.newCondition();
public void Produce(String name){
try {
lock.lock();
while (this.count == maxCount){
System.out.println("商品數量已經達最大,等待消費者消費");
producer.await();
}
this.name = name;
System.out.println(Thread.currentThread().getName()+"生產"+(count++)+"商品");
consumer.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void Consume(){
try {
lock.lock();
while (this.count == 0){
System.out.println("商品已經被消費完,等待生產");
consumer.await();
}
System.out.println(Thread.currentThread().getName()+"消費"+(count--)+"商品");
producer.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
@Override
public String toString() {
return "goods{" +
"name='" + name + '\'' +
", count=" + count +
'}';
}
}
class Producer implements Runnable{
private goods good;
public Producer(goods good){
this.good = good;
}
@Override
public void run() {
while (true){
this.good.Produce("anmuxi");
}
}
}
class Consumer implements Runnable{
private goods good;
public Consumer(goods good){
this.good = good;
}
@Override
public void run() {
while (true){
this.good.Consume();
}
}
}
public class produceConsum {
public static void main(String[] args) {
List<Thread> list = new ArrayList<>();
goods good = new goods(10);
Producer producer = new Producer(good);
Consumer consumer = new Consumer(good);
for (int i = 0;i < 2;i++){
Thread thread = new Thread(producer,"生產"+i);
list.add(thread);
}
for (int i = 0;i < 4;i++){
Thread thread = new Thread(consumer,"消費"+i);
list.add(thread);
}
for (Thread t:list) {
t.start();
}
}
}