当前位置: 首页 > 知识库问答 >
问题:

Java从ExecutorService设置回调

艾灿
2023-03-14

我有一个fixedThreadPool,我正在使用它运行一组工作线程,以实现具有许多组件的任务的并行执行。

当所有线程完成后,我使用方法(getResult)检索它们的结果(相当大),并将其写入文件。

最后,为了节省内存并能够看到中间结果,我希望每个线程在完成执行后将其结果写入文件,然后释放内存。

通常,我会在run()方法的末尾添加这样的代码。但是,此类中的某些其他对象也调用这些线程,但不希望它们将结果写入文件-相反,它们使用它们的结果来执行其他计算,这些计算最终被写入文件。

所以,我想知道是否可以将回调函数附加到使用ExecutorService完成线程的事件中。这样,我可以立即检索其结果并在该场景中释放内存,但在其他场景中使用这些线程时不会破坏代码。

这样的事情可能吗?

共有3个答案

毕胡非
2023-03-14

ExecutorService#提交返回未来任务

ExecutorService executor = Executors.newFixedThreadPool(10);
Future<Long> future = executor.submit(new Callable<Long>(){
       @Override
       public Long call() throws Exception {
           long sum = 0;
           for (long i = 0; i <= 10000000l; i++) {
               sum += i;
           }
           return sum;
       }
});
Long result = future.get();
System.out.println(result);

孙嘉悦
2023-03-14

您可以在Java 8中使用CompletableFuture添加线程返回的回调,如下所示,其中t是长期运行计算的结果,

CompletableFuture.supplyAsync(() -> {
    T t = new T();
    // do something
    return t;
}).thenApply(t -> {
    // process t
});

如果您只想在Java 7中使用回调,可以执行以下操作:,

int x = 10;
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(x);
Future<T> result = fixedThreadPool.submit(() -> {
    // do calculation
    return T;
});
fixedThreadPool.submit(() -> {
    long minutesToWait = 5;
    T t = null;
    try {
        t = result.get(minutesToWait, TimeUnit.MINUTES);
    } catch (InterruptedException | ExecutionException | TimeoutException e) {
        LOGGER.error(e);
    }
    if (t != null) {
        // process t
    }
});
穆毅然
2023-03-14

如果可以选择使用Google Guava,则可以以下列方式使用ListenableFuture界面:

  1. 通过更多执行器将执行器服务转换为ListingExecutorService。ListingDecorator(existingExecutorService)
  2. 提交(可调用
 类似资料:
  • 我应该创建一个从迭代器中提取下一个任务的任务吗?或者有什么更好的方法来实现这一点?

  • 在直播管理页面点击 “回调设置” ,可以 开启回调通知 并 设置回调地址 ,用于直播开始、直播结束、直播录制、离线回放、回放重置后的通知反馈。 关于直播回调的具体功能及使用方法,请参考:回调接口开发指南 。

  • 问题内容: 我正在研究用于并行计算JavaSeis.org的软件开发框架。我需要一个强大的机制来报告线程异常。在开发过程中,了解异常来自何处具有很高的价值,因此我想在过度报告方面犯错。我还希望能够在线程中处理Junit4测试。下面的方法是合理的还是有更好的方法? 问题答案: 我不相信在使用时有标准的“钩子”来获取这些异常。但是,如果您需要支持(听起来很合理,假设您使用),则始终可以包装Callab

  • 问题内容: 我有使用计划任务的代码。我环顾四周,发现可以做到这一点。因此,这里有一个问题,你是否使用过并安排了任务,一次使用比另一次使用有什么好处? 还想检查是否有人使用过该课程并遇到任何为他们解决的问题。 问题答案: 根据实践中的Java并发性: 对系统时钟的变化很敏感,不是。 只有一个执行线程,因此长时间运行的任务可能会延迟其他任务。可以配置任意数量的线程。此外,你可以根据需要完全控制创建的线

  • java.util.concurrent.ExecutorService接口是Executor接口的子接口,并添加了管理生命周期的功能,包括单个任务和执行程序本身。 ExecutorService方法 Sr.No. 方法和描述 1 boolean awaitTermination(long timeout, TimeUnit unit) 阻止所有任务在关闭请求之后完成执行,或发生超时,或者当前线程

  • 我正在尝试并行运行15个服务,每个服务将向不同的客户发送邮件。提取标准因服务而异 服务1、服务2、服务3。。。。服务15。每个类都扩展了NotificationService类。 NotificationService类具有方法extractRecipients()、sendMail()、sendSMS()、logNotification()。 所有的Service类[1到15]都有进程()方法,