[英]Asynchronous equivalent of BlockingQueue in Java?
我正在寻找一个与java.util.concurrent.BlockingQueue
等效的异步(非阻塞)队列。 它的界面将包括:
public interface AsynchronousBlockingQueue<E> {
// - if the queue is empty, return a new CompletableFuture,
// that will be completed next time `add` is called
// - if the queue is not empty, return a completed CompletableFuture,
containing the first element of the list
public CompletableFuture<E> poll();
// if polling is in progress, complete the ongoing polling CompletableFuture.
// otherwise, add the element to the queue
public synchronized void add(E element);
}
如果这很重要,应该只有一个轮询线程,并且轮询应该按顺序进行( poll
已经在进行时不会调用 poll)。
我预计它已经存在于 JVM 中,但我找不到它,当然我宁愿使用 JVM 中的东西也不愿自己编写。
另一个限制是,我坚持使用 Java 8(尽管我绝对有兴趣了解最新版本中存在的内容)。
所以最后我写了我自己的 class ......有兴趣评论:)
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.CompletableFuture;
public class AsynchronousBlockingQueue<E> {
CompletableFuture<E> incompletePolling = null;
Queue<E> elementsQueue = new LinkedList<>();
// if the queue is empty, return a new CompletableFuture, that will be completed next time `add` is called
// if the queue is not empty, return a completed CompletableFuture containing the first element of the list
public synchronized CompletableFuture<E> poll() {
// polling must be done sequentially, so this shouldn't be called if there is a poll ongoing.
if (incompletePolling != null)
throw new IllegalStateException("Polling is already ongoing");
if (elementsQueue.isEmpty()) {
incompletePolling = new CompletableFuture<>();
return incompletePolling;
}
CompletableFuture<E> result = new CompletableFuture<>();
result.complete(elementsQueue.poll());
return result;
}
// if polling is in progress, complete the ongoing polling CompletableFuture.
// otherwise, add the element to the queue
public synchronized void add(E element) {
if (incompletePolling != null) {
CompletableFuture<E> result = incompletePolling;
// removing must be done first because the completion could trigger code that needs the queue state to be valid
incompletePolling = null;
result.complete(element);
return;
}
elementsQueue.add(element);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.