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();
    }
}