首页 > Java > java教程 > 正文

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

Linda Hamilton
发布: 2024-11-17 05:57:03
原创
699 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板