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

我能否找到一个明确的方法来实现这一目标。我已经使用了加入并等待替代生产者和消费者执行。这个问题是在一次采访中被问到的。他不喜欢我的解决方案。我还建议在同步块内循环,用于消耗/生产资源。

以下是预期输出:

p1 c1 p3 c1 p2 c1 p2 p2 c1 . . .


慕码人8056858
浏览 118回答 1
1回答

千万里不及你

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() {@Overridepublic 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();        }    }   }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java