java信号量还是方便。以后写这类题直接信号量省事。。但是效率估计没有其他高
import java.util.concurrent.Semaphore;
public class multi_print_Producer_consumer {
private static volatile int i=0;
private static Semaphore lock=new Semaphore(1);
public static class Producer implements Runnable{
int count=0;
Semaphore product1;
Semaphore product2;
Producer(int n,Semaphore p1,Semaphore p2){
count=n;
this.product1=p1;
this.product2=p2;
}
@Override
public void run() {
while(i<count){
try {
lock.acquire();
System.out.println("锁住");
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
if(i%2==0){
product1.release();
System.out.println("生产1");
}else{
product2.release();
System.out.println("生产2");
}
}
System.out.println("生产者结束"+lock.availablePermits());
}
}
public static class Consumer implements Runnable {
int id=0;
Semaphore product;
Consumer(int i,Semaphore p){
id=i;
product=p;
}
@Override
public void run() {
while (true){
try {
product.acquire();
System.out.println("消费:");
System.out.println(i+":"+id+"-"+Thread.currentThread().getName());
System.out.println("释放锁");
lock.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
//结束点
if(i>=9){
break;
}
}
System.out.println("消费者结束"+Thread.currentThread().getName()+product.availablePermits());
}
}
public static void main(String[] args) {
Semaphore product1=new Semaphore(0),product2=new Semaphore(0);
//生产者
//交替生产10次 产品 1和2
new Thread(new Producer(10,product1,product2)).start();
//开两个消费者,一个消费1,一个消费2
new Thread(new Consumer(0,product1)).start();
new Thread(new Consumer(1,product2)).start();
}
}