欢迎访问宙启技术站
智能推送

Java中的同步函数和异步函数有什么区别?

发布时间:2023-05-25 23:08:01

Java中的同步函数与异步函数可以说是两种不同的调用方式,其中同步函数调用是一种阻塞式的调用方式,而异步函数调用则是一种非阻塞式的调用方式。在Java中,同步调用函数是一种常见的方式,它会等待被调用的函数执行完毕后才返回结果。而异步调用函数则是一种相对较新的方式,它会先返回一个Promise对象,然后在后台执行被调用的函数,待函数执行完毕后调用回调函数或触发事件,以通知调用者函数已经执行完毕。

下面我们来深入探讨Java中同步函数和异步函数的区别。

1.同步函数

同步函数是指在函数执行完成之前,调用该函数的线程会被阻塞,等待该函数返回结果。它会在执行函数的过程中一直等待,直到函数执行完毕后才返回结果。换句话说,同步调用函数是一种阻塞式的调用方式。

当调用一个同步函数时,程序会一直阻塞等待函数的返回结果,这通常是一件好事,因为在等待函数返回的同时可以保证代码的正常运行,但是如果被调用的函数需要很长时间才能执行完成,则会影响程序的性能和响应速度。因此,同步调用方式通常不适用于需要长时间执行的代码。

下面是一段Java代码示例:

public class TestSyncFunction {

    public static void main(String[] args) {
        TestSyncFunction testSyncFunction = new TestSyncFunction();
        int result = testSyncFunction.syncFunction(10);
        System.out.println(result);
    }

    public int syncFunction(int num) {
        int sum = 0;
        for (int i = 0; i <= num; i++) {
            sum = sum + i;
        }
        return sum;
    }
}

在上面的代码中,我们定义了一个名为syncFunction的同步函数,该函数接收一个整型参数num,实现功能是计算从1到num之间所有整数的和,并将结果返回。

在主函数中,我们创建了TestSyncFunction类的一个实例,并调用了syncFunction函数。因为syncFunction是一个同步函数,所以在调用该函数时,程序会一直等待该函数执行完毕,并返回结果,只有当函数执行完毕后,程序才会继续执行,打印出结果18。

2.异步函数

异步函数是指在调用该函数时,不会等待函数执行完成,而是立即返回一个Promise对象,并在后台执行该函数。当函数执行完毕后,会调用回调函数或者触发事件,以通知调用者该函数已经执行完毕,并返回结果。

异步调用函数通常用于需要进行长时间计算的代码,例如处理大量数据、网络请求等。异步调用方式可以大大提高程序的响应速度和性能,但是在异步处理过程中,调用者不能直接获得函数的执行结果,需要等待回调函数或事件的触发才能获取结果。

下面是一段Java代码示例:

public class TestAsyncFunction {

    public static void main(String[] args) {
        TestAsyncFunction testAsyncFunction = new TestAsyncFunction();
        CompletableFuture<Integer> future = testAsyncFunction.asyncFunction(10);
        future.thenAccept(result -> System.out.println(result));
        System.out.println("Do something else...");
    }

    public CompletableFuture<Integer> asyncFunction(int num) {
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            int sum = 0;
            for (int i = 0; i <= num; i++) {
                sum = sum + i;
            }
            return sum;
        });
        return future;
    }
}

在上面的代码中,我们定义了一个名为asyncFunction的异步函数,并返回了一个CompletableFuture对象。在主函数中,我们创建了TestAsyncFunction类的一个实例,并调用了asyncFunction函数。

由于asyncFunction是一个异步函数,所以在调用该函数时,不会等待函数执行完成,而是立即返回一个CompletableFuture对象。我们可以通过在该Future对象上调用thenAccept方法设置回调函数,在函数执行完毕后打印出结果18。

需要注意的是,在调用asyncFunction函数之后,程序的执行流程将跳过thenAccept方法,继续执行后面的代码,也就是"do something else..."。当异步计算完成后,系统会自动调用thenAccept中的lambda表达式,以便我们进行后续操作。