那么同步调用和异步调用请举一个例子
时间: 2024-04-18 08:27:52 浏览: 174
当涉及到网络请求时,同步调用和异步调用可以用以下示例来说明:
1. 同步调用示例:
假设我们需要通过网络请求获取某个网站的数据,并将其打印出来。在同步调用中,代码会在发送请求后等待响应返回后再继续执行。
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
public class SyncExample {
public static void main(String[] args) {
try {
// 创建URL对象
URL url = new URL("https://example.com");
// 打开连接并获取输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
// 读取数据并打印
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 关闭连接
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
// 其他代码...
}
}
```
在这个示例中,`url.openStream()` 是一个同步调用,它会阻塞代码的执行直到数据完全加载并返回。
2. 异步调用示例:
现在我们使用异步调用来实现相同的功能。在异步调用中,代码会在发送请求后继续执行,不会等待响应的返回。
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.concurrent.CompletableFuture;
public class AsyncExample {
public static void main(String[] args) {
// 创建URL对象
URL url;
try {
url = new URL("https://example.com");
// 使用CompletableFuture来进行异步请求
CompletableFuture.supplyAsync(() -> {
try {
// 打开连接并获取输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
// 读取数据并返回
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
// 关闭连接
reader.close();
return response.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}).thenAccept(response -> {
// 异步操作完成后执行的回调,打印响应结果
System.out.println(response);
});
} catch (IOException e) {
e.printStackTrace();
}
// 其他代码...
}
}
```
在这个示例中,我们使用了`CompletableFuture`来进行异步请求。`url.openStream()` 被包装在一个异步任务中,当任务完成后会调用 `thenAccept` 方法指定的回调函数来处理响应结果。这样,在请求发送后,代码会立即继续执行,不会等待响应返回。
阅读全文