gpt4 book ai didi

java - 如何避免多生产者和消费者的饥饿?

转载 作者:行者123 更新时间:2023-11-30 07:46:09 25 4
gpt4 key购买 nike

  1. 这里考虑 2 个生产者线程和 1 个消费者线程。
  2. 假设队列已满。
  3. 两个生产者线程进入等待状态,因为队列已满。
  4. 消费者线程从队列中获取元素并通知所有,因此其中一个生产者线程添加元素并退出,另一个生产者线程保持等待状态,另一个生产者线程再次添加元素并退出。
  5. 因此,如果您观察到一个线程有可能一直处于等待状态。

如何避免这种情况?

import java.util.LinkedList;
import java.util.List;

interface BlockingQueueCustom<E> {

void put(E item) throws InterruptedException ;

E take() throws InterruptedException;
}

class LinkedBlockingQueueCustom<E> implements BlockingQueueCustom<E> {

private List<E> queue;
private int maxSize; // maximum number of elements queue can hold at a time.

public LinkedBlockingQueueCustom(int maxSize) {
this.maxSize = maxSize;
queue = new LinkedList<E>();
}

public synchronized void put(E item) throws InterruptedException {

while(queue.size() == maxSize) {
this.wait();
}

queue.add(item);
this.notifyAll();
}

public synchronized E take() throws InterruptedException {

while(queue.size() == 0) {
this.wait();
}

this.notifyAll();
return queue.remove(0);

}

}

public class BlockingQueueCustomTest {
public static void main(String[] args) throws InterruptedException {
BlockingQueueCustom<Integer> b = new LinkedBlockingQueueCustom<Integer>(10);
System.out.println("put(11)");
b.put(11);
System.out.println("put(12)");
b.put(12);
System.out.println("take() > " + b.take());
System.out.println("take() > " + b.take());

}
}

最佳答案

waitnotify 的使用已经过时since 2005因为它的功能有限。

对于您的具体问题,我真的建议重构您的解决方案以使用 Java Semaphore class .你会看到你可以设置一个公平参数。此参数将确保分配以 FIFO 方式完成,以便一旦您的一个线程获得许可并将数据放入您的队列中,它会在再次阻塞时被带到行尾(因此,第二个线程将获得优先权)。

希望这对您有所帮助。

关于java - 如何避免多生产者和消费者的饥饿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50935418/

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