任务队列必须按顺序处理。虽然最简单的方法涉及在 Future 上使用 .get() 阻止每个任务的完成,但这种方法在管理大量队列时可能会导致内存问题。目标是实现一种非阻塞机制,在任务完成时通知调用者,从而允许任务按顺序处理而不会阻塞。
为了避免阻塞,解决方案涉及定义任务完成时接收参数的回调接口。然后在每个任务结束时调用此回调。
class CallbackTask implements Runnable { private final Runnable task; private final Callback callback; CallbackTask(Runnable task, Callback callback) { this.task = task; this.callback = callback; } public void run() { task.run(); callback.complete(); } }
Java 8 引入了 CompletableFuture,它提供了更全面的创建机制异步和条件管道。
import java.util.concurrent.CompletableFuture; public class GetTaskNotificationWithoutBlocking { public static void main(String... argv) throws Exception { ExampleService svc = new ExampleService(); GetTaskNotificationWithoutBlocking listener = new GetTaskNotificationWithoutBlocking(); CompletableFuture<String> f = CompletableFuture.supplyAsync(svc::work); f.thenAccept(listener::notify); } }
在ExampleService中类:
class ExampleService { String work() { // Code to perform long-running task return "Result from long-running task"; } }
在监听器类中:
class GetTaskNotificationWithoutBlocking { void notify(String msg) { // Code to handle the message from the completed task } }
以上是如何在 Java 执行器中不阻塞地获取任务完成通知?的详细内容。更多信息请关注PHP中文网其他相关文章!