首页  >  文章  >  Java  >  如何在 Java 执行器中不阻塞地获取任务完成通知?

如何在 Java 执行器中不阻塞地获取任务完成通知?

Linda Hamilton
Linda Hamilton原创
2024-11-17 05:57:03698浏览

How to Get Task Completion Notifications Without Blocking in Java Executors?

Java 执行器:在任务完成时以不阻塞的方式进行通知

问题陈述

任务队列必须按顺序处理。虽然最简单的方法涉及在 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();
  }

}

CompletableFuture

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn