手写一个单线程的生产者和消费者实现,实现生产者生产一个数字,如果已经生产线程等待,调用消费者消费这个数字,取消等待再次生产。
流程
单线程实现生产者消费者
public class OtherService {
private int i = 1;
// 添加一个锁
final private Object LOCK = new Object();
private Boolean flage = false;
// 生产者
public void produck(){
synchronized (LOCK){
if (flage){
try {
LOCK.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
i++;
System.out.println("P"+i);
LOCK.notify();
flage = true;
}
}
}
// 消费者
public void Customer(){
synchronized (LOCK){
if(flage){
// 消费
System.out.println("C"+i);
// 启用线程
LOCK.notify();
flage = false;
}else{
try {
LOCK.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
此种方法只能实现单线程的,无法实现多线程,如果同时创建多个生产者和消费者就会出现错误。
public static void main(String[] args) {
OtherService o = new OtherService();
Stream.of("p1","p2").forEach(
n -> new Thread (){
@Override
public void run() {
while (true)
o.produck();
}
}.start()
);
Stream.of("C1","C2").forEach(c ->
new Thread(){
@Override
public void run() {
while (true)
o.Customer();
}
}.start()
);
}
线程会出现假死。多线程如何解决呢。
多线程实现生产者消费者
将notify修改为notifyAll可以解决一个生产者对应多个消费者的问题,不会有一个生产者对应多个消费者的错误。为方便测试可以添加多个线程测试。