Another possible approach for async processing is like this with an event loop:

```java
void process() {
   eventLoop.schedule(() -> {
        T t;
        while((t = queue.poll()) != null) {
            doWork(t);
            if(queue.size() < THRESHOLD) {
                subscription.request(queue.capacity());
            }
        }
   })
}
```