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)中执行的,由于异步任务是在另一个线程中执行,因此在异步任务执行的同时,主线程还可以继续执行同步任务,不会被异步任务阻塞。
最终输出了异步任务和同步任务的结果,可以看到异步任务的结果会在异步任务执行完成后被回调函数输出。