gpt4 book ai didi

java - 单生产者多消费者 Java

转载 作者:太空宇宙 更新时间:2023-11-04 09:57:26 25 4
gpt4 key购买 nike

我是 Java 并发的新手,正在尝试实现/实现单个生产者[P1]和多个消费者[C1、C2、C3]。

这个想法是生产者 [P1] 放入值,而消费者 C1、C2、C3 都运行其任务来单独读取 P1 放入的值。一旦C1、C2、C3读取值,P1再次输入新数据。然后C1,C2,C3读取数据,如此循环下去。

等待通知对于单生产者单消费者工作得很好,但在这种情况下单生产者多消费者等待通知概念看起来并不是一个好的策略。我应该如何解决这个问题。

最佳答案

感谢@Ivan 和@Andreas。

@Ivan - 在他的评论中让我了解了生产者消费者模式的行为方式。@Andreas - 在他的评论中建议使用 Phaser。 (我使用循环屏障代替,因为我的注册线程数不会动态变化)

他们的评论共享以下示例代码。如果有任何或更好的方法来处理这个问题,请提出即兴创作的建议。

主类

    public static void main(String[] args)
{
SharedSpace sharedSpace = new SharedSpace(new LinkedBlockingQueue<Integer>(1));
new Thread(new Producer(sharedSpace)).start();


Consumer consumerRunnable = new Consumer(sharedSpace);
new Thread(consumerRunnable).start();

CyclicBarrier barrier = new CyclicBarrier(3,consumerRunnable);

new Thread(new EndUser(barrier,consumerRunnable)).start();
new Thread(new EndUser(barrier,consumerRunnable)).start();
new Thread(new EndUser(barrier,consumerRunnable)).start();
}

制作人

private SharedSpace sharedSpace;

public Producer(SharedSpace sharedSpace) {
super();
this.sharedSpace = sharedSpace;
}

public SharedSpace getSharedSpace() {
return sharedSpace;
}

public void setSharedSpace(SharedSpace sharedSpace) {
this.sharedSpace = sharedSpace;
}

@Override
public void run() {

for(int i=0;i<3;i++)
{
int value = (int) (Math.random()*30);
sharedSpace.addValue(value);
}


}

生产者和消费者共享队列

private BlockingQueue<Integer> queue;

public SharedSpace(BlockingQueue<Integer> queue) {
super();
this.queue = queue;
}

public BlockingQueue<Integer> getQueue() {
return queue;
}

public void setQueue(BlockingQueue<Integer> queue) {
this.queue = queue;
}

public void addValue(int value)
{
try {
queue.put(value);
System.out.println(System.nanoTime()+" Producer added value "+value);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public int getValue() throws InterruptedException
{
return queue.take();


}

消费者

private SharedSpace sharedSpace;

private Integer value;

public Consumer(SharedSpace sharedSpace) {
super();
this.sharedSpace = sharedSpace;
}

public SharedSpace getSharedSpace() {
return sharedSpace;
}

public void setSharedSpace(SharedSpace sharedSpace) {
this.sharedSpace = sharedSpace;
}

public Integer getValue() {
return value;
}

public void setValue(Integer value) {
this.value = value;
}

@Override
public void run()
{

try {
setValue(sharedSpace.getValue());
} catch (InterruptedException e) {
e.printStackTrace();
}

}

最终用户

CyclicBarrier barrier;

Consumer consumer;

public EndUser(CyclicBarrier barrier) {
super();
this.barrier = barrier;
}

public EndUser(CyclicBarrier barrier, Consumer consumer) {
super();
this.barrier = barrier;
this.consumer = consumer;
}


public Consumer getConsumer() {
return consumer;
}

public void setConsumer(Consumer consumer) {
this.consumer = consumer;
}


public CyclicBarrier getBarrier() {
return barrier;
}


public void setBarrier(CyclicBarrier barrier) {
this.barrier = barrier;
}


@Override
public void run() {
try
{
while(true)
{
System.out.println(consumer.getValue());
barrier.await();
}
}
catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}

}

输出[消费者不会从生产者读取数据,除非所有最终用户都获取了他们的数据]

Producer added value 24
Producer added value 10
24
24
24
10
10
Producer added value 0
10
0
0
0

关于java - 单生产者多消费者 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53936808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com