Java中的同步和异步

  Java中的异步(asynchronous)和同步(synchronous)都是针对线程操作而言的。

  异步操作是指调用某个方法后,不会立即得到结果,而是通过回调函数、监听器等方式等待结果返回,这样可以提高程序的响应速度,避免因为等待某个操作完成而导致线程被阻塞。

  同步操作是指调用某个方法后,必须等待该方法返回结果才能继续执行后续代码,这种方式可能会导致线程被阻塞,降低程序的响应速度。

以下是Java中异步和同步的示例代码:

import java.util.concurrent.CompletableFuture;

public class Main {
    public static void main(String[] args) throws Exception {
        // 异步操作
        CompletableFuture.supplyAsync(() -> {
            System.out.println("Async task is running in thread " + Thread.currentThread().getName());
            return "Async task result";
        }).thenAccept(result -> {
            System.out.println("Async task finished with result: " + result);
        });

        // 同步操作
        String result = synchronousTask();
        System.out.println("Synchronous task finished with result: " + result);
    }

    public static String synchronousTask() {
        System.out.println("Synchronous task is running in thread " + Thread.currentThread().getName());
        return "Synchronous task result";
    }
}

  在上面的示例中,使用CompletableFuture实现了异步操作,通过supplyAsync方法提交一个任务,该任务会在另一个线程中执行,然后通过thenAccept方法注册一个回调函数,该函数会在任务执行完成后被调用。

  同时,也演示了同步操作,synchronousTask方法会在当前线程中执行,并返回一个结果,但该方法的执行会阻塞当前线程。

  注:由于异步任务是在另一个线程中执行,因此异步任务的输出和同步任务的输出可能会交替出现,执行结果可能因环境而异。

输出结果

Async task is running in thread ForkJoinPool.commonPool-worker-1
Synchronous task is running in thread main
Synchronous task finished with result: Synchronous task result
Async task finished with result: Async task result

  可以看到,异步任务是在另一个线程(ForkJoinPool.commonPool-worker-1)中执行的,而同步任务是在主线程(main)中执行的,由于异步任务是在另一个线程中执行,因此在异步任务执行的同时,主线程还可以继续执行同步任务,不会被异步任务阻塞。

  最终输出了异步任务和同步任务的结果,可以看到异步任务的结果会在异步任务执行完成后被回调函数输出。

posted @ 2023-04-01 20:55  海边蓝贝壳  阅读(472)  评论(0编辑  收藏  举报