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

如何在Java中实现非阻塞期货

颜欣怡
2023-03-14

Java Future对象用于获取由并行线程(执行器)执行的异步计算的结果。我们调用Future.get()方法并等待结果就绪。此示例显示了一种从Future检索结果的非阻塞方式。java实现java非阻塞未来。

NonBlockingExecutor executor = new NonBlockingExecutor(Executors.newSingleThreadExecutor());

NonBlockingFuture<Integer> future = executor.submitNonBlocking(new Callable<Integer>() {

            @Override
            public Integer call() throws Exception {
                String threadName = Thread.currentThread().getName();
                System.out.println(threadName);
                //print -> pool-1-thread-1
                return 1;
            }
});

future.setHandler(new FutureHandler<Integer>() {

       @Override
       public void onSuccess(Integer value) {
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName);
            //print -> pool-1-thread-1
       }

       @Override
       public void onFailure(Throwable e) {
            System.out.println(e.getMessage());
       }
 });

 Thread.sleep(50000);

在本例中,在并行执行完成后调用onSuccess()方法。问题在于onSuccess()方法未在主线程上运行。我想在主线程上执行onSuccess()方法。我怎样才能解决这个问题。谢谢

共有3个答案

况胡媚
2023-03-14

我想在主线程上执行onSuccess()方法。我怎样才能解决这个问题。

蒙奇
2023-03-14
匿名用户

未来的要点是相关计算在单独的线程中执行。onSuccess方法是该独立线程表示其已完成计算的一种方式。主线程在成功时调用是没有意义的,因为主线程不执行计算,也不知道计算何时完成。

在主线程中,如果要等待计算完成并获得结果,请调用get()。如果要检查计算是否完成,如果尚未完成,则继续执行其他操作,请调用isDone()get(long,TimeUnit)。如果要终止计算,无论计算是否完成,请调用cancel()

国景铄
2023-03-14

这是支持的完全期货。

    CompletableFuture.runAsync(() -> {
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName);
        //print -> pool-1-thread-1
    }).whenComplete((task, throwable) -> {
        if(throwable != null) {
           System.out.println(e.getMessage());
        } else {
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName);
            //print -> pool-1-thread-1
        }
    });

这里的警告是,未来将在执行线程而不是提交线程上运行完成任务时的

 类似资料:
  • 如另一个问题中所述,当使用Undertow时,所有处理都应该在专用的工作线程池中完成,如下所示: 我知道可用于显式地告诉Undertow在专用的线程池中调度请求以阻止请求。我们可以通过将包装在实例中来修改上面的示例,如下所示: 调用此方法将exchange置于阻塞模式,并创建一个BlockingHttpExchange对象来存储流。当交换处于阻塞模式时,输入流方法变得可用,除了阻塞和非阻塞模式之间

  • 试图为自己总结这两个概念之间的区别(因为当我看到人们在一个句子中同时使用这两个概念时,我真的很困惑,比如“非阻塞异步IO”,我试图弄清楚它是什么意思)。 因此,在我的理解中,非阻塞IO是主要的OS机制,如果有任何数据准备就绪,它将处理IO,否则只返回错误/不做任何事情。 那么实际上什么是“非阻塞异步IO”呢?以及如何在Java(标准JDK,没有外部库,我知道有和)中实现所有的IO:非阻塞IO、异步

  • 我是新进入Vert. x的。我遵循了Vert. x文档和一些教程。但是我混淆了使用Vert. x实现非阻塞REST Web服务的正确方法是什么。我在Java中找到了这篇文章开发非阻塞Web应用程序,其中包含一个使用Vert. x实现非阻塞Web应用程序的示例。 此代码块包含向另一个Vertical(“todoService”:TodoServiceVerticle)发送消息。 这是“todoSer

  • 问题内容: 尝试为自己总结这两个概念之间的区别(因为当我看到人们在一句话中同时使用这两个概念时,我感到非常困惑,例如“ Non-blocking async IO”,我试图弄清楚它是做什么的)意思)。 因此,以我的理解,无阻塞IO是操作系统的主要机制,如果有任何可用数据,则该OS处理IO,否则仅返回错误/不执行任何操作。 在异步IO中,您仅提供回调,当数据可用时,系统将通知您的应用程序。 那么,实

  • 问题内容: 基本上,我有一个URL,当发布新消息时,该URL在聊天室中流xml更新。我想将URL转换为InputStream并继续读取它,只要保持连接并且没有发送Thread.interrupt()。我遇到的问题是,当有内容要从流中读取时,BufferedReader.ready()似乎不正确。 我正在使用以下代码: 当我运行代码并将某些内容发布到聊天室时,buf.ready()永远不会变为tru

  • 问题内容: 我可以很轻松地在Node.js中编写非阻塞I / O。 这就是整个库的用途。 但是所做的任何计算都是阻塞的。任何通过事件发送器的消息都将被阻止。 例如,发出事件立即得到解决,因此被阻止: 除了将调用包装起来外,如何使代码无阻塞? 我希望在事件循环的每个周期中进行尽可能少的计算,以便可以同时为尽可能多的客户端提供服务。 如何以非阻塞方式编写代码? 当我拥有非阻塞代码时,如何在多个进程之间