【CompletableFuture】CompletableFuture测试runAsync()方法调用CompletableFuture.join()/get()方法阻塞主线程

问题

  CompletableFuture.runAsync() 返回 CompletableFuture<Void>对象,调用CompletableFuture.allOf(f1,f2).join() 是否能够阻塞主线程

结论

    public static void main(String[] args) {
        CompletableFuture<Void> f1 = CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("第一个异步任务");
        });

        CompletableFuture<Void> f2 = CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("第二个异步任务");
        });
        CompletableFuture.allOf(f1,f2).join();
        System.out.println("CompletableFuture Test runAsync");
    }

  CompletableFuture.runAsync() 返回 CompletableFuture<Void>对象,调用CompletableFuture.allOf(f1,f2).join() 可以阻塞主线程

原文地址:https://www.cnblogs.com/july-sunny/p/12706549.html

时间: 04-15

【CompletableFuture】CompletableFuture测试runAsync()方法调用CompletableFuture.join()/get()方法阻塞主线程的相关文章

怎么在调用异步请求时不阻塞当前线程

在异步编程中,经常会调用已经写好的异步方法.这时会有一个需求:根据异步方法的返回值,做一些别的操作.这时会有两种实现方式: 1. 使用await,阻塞线程,等待异步方法的完成,然后获得返回值,再进行别的操作.示例: static void Main(string[] args) { Console.WriteLine("--------------程序运行开始-----------"); string url = "http://www.baidu.com"; va

两种冒泡排序方法调用的修改--一个方法同时实现两种排序

class Program { /// <summary> /// 数组排序 /// </summary> /// <param name="arr">数组</param> /// <param name="b">true为从小到大排列 false为从大到小排列</param> /// <returns>排序完的数组</returns> static int[] Meth

Struts2动态方法调用(DMI)

在Struts2中动态方法调用有三种方式,动态方法调用就是为了解决一个Action对应多个请求的处理,以免Action太多 第一种方式:指定method属性这种方式我们前面已经用到过,类似下面的配置就可以实现 <action name="chainAction" class="chapter2.action.Chapter2Action" method="chainAction"> <result name="chai

方法调用指令

在JDK7之前方法调用的字节码指令共有四条,invokeinterface.invokespecial.invokestatic.invokevirtual.由这四条指令完成Java中所有类型方法的调用. invokeinterface(调用接口方法) 无符号数indexbyte1和indexbyte2共同组件一个当前类常量池索引(index),该索引值为(indexbyte1<<8)|indexbyte2,即高位在前的两个字节无符号值.在常量池中索引为index的数据项必须为一个接口方法的符

2015/9/21 Python基础(17):绑定和方法调用

绑定和方法调用现在我们需要再次阐述Python中绑定(binding)的概念,它主要与方法调用相关联.方法是类内部定义的函数,这意味着方法是类属性而不是实例属性.其次,方法只有在其所属的类拥有实例时,才能被调用.当存在一个实例时,方法才被认为是绑定到那个实例了,没有实例时,方法就是未绑定的.任何一个方法定义中都有一个参数是变量self.它表示调用此方法的实例对象. 核心笔记:self变量用于在类实例方法中引用方法所绑定的实例.方法的实例在任何方法调用中总是作为第一参数传递的,self代表方法的实

利用JQuery直接调用asp.net后台方法

利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法. [WebMethod]   命名空间 1.无参数的方法调用, 注意:1.方法一定要静态方法,而且要有[WebMethod]的声明 后台<C#>: using System.Web.Script.Services; [WebMethod] public static string SayHello() { return "Hello Ajax!"; } 前台<JQuery>: 1 2 3

JVM 方法调用之解析

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还没有涉及到方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍最频繁的操作,但Class文件的编译过程不包含传统编译中的连接步骤,一切方法调用在Class文件里存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于之前说的直接引用).这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法调用过程变得相对复杂起来,需要在类加载期间,甚至到了运行期间才能确定目标方

多态方法调用的解析和分派

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍.最频繁的操作,Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于之前说的直接引用).这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法调用过程变得相对复杂起来,需要在类加载期间,甚至到运行期间才能确定目标方法

[Android初级]NDK入门体验の方法调用

    本文属于自我复习,内容重复请勿见怪 如何在android应用的自定义底层C中调用java的代码?这是本次自我复习的计划. 首先,我得创建一个demo,结构如下: 1.创建一个接口类NativeDataProvider,他的作用是调用c方法,然后回调java方法 public class NativeDataProvider { static final String TAG = "NativeDataProvider"; private Context context; pub

深入理解Java虚拟机笔记---方法调用

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍.最频繁的操作.在Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于直接引用).这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法的调用过程变得相对复杂,需要在类加载期间甚至到运行期间才能确定目标方法的直接引用.