java 多队列_Java - 多个队列生成者消费者

通过使用Semaphore和AtomicBoolean实现了一个名为BinarySemaphore的类,用于在Java中处理多生产者和单消费者的问题。消费者在一个循环中不断检查工作,并在没有任务时等待信号。Producer类提供signalSomethingToDo()方法来通知有工作可用。BinarySemaphore类确保了资源的正确同步和释放。
摘要由CSDN通过智能技术生成

我按照@Abe所建议的方式解决了类似的情况,但决定使用 Semaphore 与 AtomicBoolean 组合并将其称为BinarySemaphore . 它确实需要对 生产环境 者进行修改,以便在有事情要做时发出信号 .

在BinarySemaphore的代码下面,以及消费者工作循环应该是什么样子的一般概念:

import java.util.concurrent.Semaphore;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.atomic.AtomicBoolean;

public class MultipleProdOneConsumer {

BinarySemaphore workAvailable = new BinarySemaphore();

class Consumer {

volatile boolean stop;

void loop() {

while (!stop) {

doWork();

if (!workAvailable.tryAcquire()) {

// waiting for work

try {

workAvailable.acquire();

} catch (InterruptedException e) {

if (!stop) {

// log error

}

}

}

}

}

void doWork() {}

void stopWork() {

stop = true;

workAvailable.release();

}

}

class Producer {

/* Must be called after work is added to the queue/made available. */

void signalSomethingToDo() {

workAvailable.release();

}

}

class BinarySemaphore {

private final AtomicBoolean havePermit = new AtomicBoolean();

private final Semaphore sync;

public BinarySemaphore() {

this(false);

}

public BinarySemaphore(boolean fair) {

sync = new Semaphore(0, fair);

}

public boolean release() {

boolean released = havePermit.compareAndSet(false, true);

if (released) {

sync.release();

}

return released;

}

public boolean tryAcquire() {

boolean acquired = sync.tryAcquire();

if (acquired) {

havePermit.set(false);

}

return acquired;

}

public boolean tryAcquire(long timeout, TimeUnit tunit) throws InterruptedException {

boolean acquired = sync.tryAcquire(timeout, tunit);

if (acquired) {

havePermit.set(false);

}

return acquired;

}

public void acquire() throws InterruptedException {

sync.acquire();

havePermit.set(false);

}

public void acquireUninterruptibly() {

sync.acquireUninterruptibly();

havePermit.set(false);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值