
在Java的开发过程里,程序模块的交互是有许多种方式的,其中较为常见的就是同步调用+异步调用+回调,java开发之中最基础也是最常用的就是以上三种调用机制。在java的学习之中,了解这三种调用机制是不得不做的,调用机制也能帮助你更好的编写程序,提高其性能以及可维护性。
1. 同步调用(Synchronous Call)
同步调用是最为直接的方式,调用方在发起请求之后会阻塞等待被调用端执行完成,并在完成之后返回执行的数据。
// 同步调用示例
public class SyncExample {
public static void main(String[] args) {
System.out.println("开始同步调用");
String result = fetchDataSync();
System.out.println("收到结果: " + result);
System.out.println("同步调用结束");
}
public static String fetchDataSync() {
try {
Thread.sleep(2000); // 模拟耗时操作
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "同步数据";
}
}
2. 异步调用(Asynchronous Call)
异步调用和同步调用最大的不同就是不会阻塞主线程,它会借助线程池、Future 或 CompletableFuture 实现。
// 异步调用示例(使用 CompletableFuture)
import java.util.concurrent.CompletableFuture;
public class AsyncExample {
public static void main(String[] args) {
System.out.println("开始异步调用");
CompletableFuture.supplyAsync(() -> fetchDataAsync())
.thenAccept(result -> System.out.println("收到结果: " + result));
System.out.println("异步调用已发起,主线程继续执行");
// 等待异步任务完成(仅用于演示)
try { Thread.sleep(3000); } catch (InterruptedException e) {}
}
public static String fetchDataAsync() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "异步数据";
}
}
3. 回调(Callback)
回调则是一种类似于“反向调用”机制:其就是调用方会将一个方法或者是函数作为参数传递给被调用方,被调用方则会在适当的时机执行这个方法。
// 回调示例
interface Callback {
void onComplete(String result);
}
public class CallbackExample {
public static void main(String[] args) {
System.out.println("开始回调调用");
fetchDataWithCallback(new Callback() {
@Override
public void onComplete(String result) {
System.out.println("收到回调结果: " + result);
}
});
System.out.println("回调调用已发起");
try { Thread.sleep(3000); } catch (InterruptedException e) {}
}
public static void fetchDataWithCallback(Callback callback) {
new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
callback.onComplete("回调数据");
}).start();
}
}
总结
在java的开发过程中,同步调用是最简单但是可能造成阻塞;异步调用能够提升响应性但是需要处理并发的问题;回调机制相对灵活但是也容易出现程序员口中的“回调地狱”。
所以在实际的项目中,我们需要根据业务场景来进行选择或者组合这些调用机制。
