java实现 生产者 消费者 一对多模型

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值