为了账号安全,请及时绑定邮箱和手机立即绑定

如何为替代生产者和消费者方法编写Java多线程代码。它应该有 3 个生产者 (P1,P2,P3)

如何为替代生产者和消费者方法编写Java多线程代码。它应该有 3 个生产者 (P1,P2,P3)

慕码人8056858 2022-09-14 15:21:41
我能否找到一个明确的方法来实现这一目标。我已经使用了加入并等待替代生产者和消费者执行。这个问题是在一次采访中被问到的。他不喜欢我的解决方案。我还建议在同步块内循环,用于消耗/生产资源。以下是预期输出:p1 c1 p3 c1 p2 c1 p2 p2 c1 . . .
查看完整描述

1 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

import java.util.concurrent.atomic.AtomicInteger;


public class TestClient {


    public static void main(String[] args) {


        ProducerConsumerUtilClass pcuc=new ProducerConsumerUtilClass();


        Thread producer1= new Thread(new Runnable() {


            @Override

            public void run() {

                while(true) {

                    try {

                        Thread.sleep(1000);

                        pcuc.produce();

                    } catch (InterruptedException e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                    }


                }


            }

        });


Thread producer2= new Thread(new Runnable() {


            @Override

            public void run() {

                while(true) {

                    try {

                        Thread.sleep(1000);

                        pcuc.produce();

                    } catch (InterruptedException e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                    }


                }


            }

        });

Thread producer3= new Thread(new Runnable() {


    @Override

    public void run() {

        while(true) {

            try {

                Thread.sleep(1000);

                pcuc.produce();

            } catch (InterruptedException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }


        }


    }

});



Thread consumer1= new Thread(new Runnable() {


@Override

public void run() {

    while(true) {

        try {

            Thread.sleep(1000);

            pcuc.consume();

        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }


    }


}

});


        producer1.start();

        producer2.start();

        producer3.start();

        consumer1.start();




    }


}


 class ProducerConsumerUtilClass {


    Object obj= new Object();

    private volatile boolean  available;

    private AtomicInteger atomicInteger=null;


    public ProducerConsumerUtilClass() {

        this.available = false;;

        this.atomicInteger = new AtomicInteger(0);;

    }


    public void produce() {

        synchronized (obj) {

                while(available) {

                try {

                    obj.wait();

                } catch (InterruptedException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

                System.out.println("Produce By "+Thread.currentThread().getName()+"Value "+atomicInteger.getAndIncrement());

                this.available=true;

                obj.notifyAll();

        }


    }   


    public void consume() {

        synchronized (obj) {

                while(!available) {

                try {

                    obj.wait();

                } catch (InterruptedException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

                System.out.println("Consume By "+Thread.currentThread().getName()+"Value "+atomicInteger.getAndIncrement());

                this.available=false;

                obj.notifyAll();

        }


    }   



}


查看完整回答
反对 回复 2022-09-14
  • 1 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信