下面我将为您详细讲解Java多线程实现异步调用的方法,攻略如下:
什么是异步调用
异步调用指的是在进行某些操作时,对于一些需要等待的操作,我们不必阻塞主线程一直等待其完成,而是在另外一个线程中完成操作,并通过回调函数等方式通知主线程执行结果。
Java多线程实现异步调用的方法
Java多线程实现异步调用有多种方法,下面介绍两种比较常用的方法:
1. 使用Executor框架实现异步调用
Executor框架可以管理线程池,将任务分发给线程执行,并返回执行结果。具体实现步骤如下:
- 定义实现Callable接口的任务类,并在其中实现需要异步执行的操作。例如:
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
// 执行异步操作
return "异步操作执行结果";
}
}
- 创建线程池,并将任务提交给线程池处理。例如:
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<String> future = executorService.submit(new MyCallable());
// 可以继续执行其他任务,不需要等待MyCallable执行完毕
- 获取异步操作的执行结果。例如:
String result = future.get();
// 获取异步操作执行结果,若未完成则会阻塞,直到异步操作完成
2. 使用CompletableFuture实现异步调用
CompletableFuture是java1.8提供的异步编程利器,可以用来实现异步调用及回调函数等功能。具体实现步骤如下:
- 创建CompletableFuture对象,并执行异步操作。例如:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 执行异步操作
return "异步操作执行结果";
});
// 可以继续执行其他任务,不需要等待异步操作完成
- 添加回调函数处理异步操作的结果。例如:
future.thenAccept(result -> {
// 异步操作执行成功时的处理函数
System.out.println("异步操作的结果是:" + result);
})
.exceptionally(e -> {
// 异步操作执行失败时的处理函数
System.out.println("异步操作执行失败,异常信息为:" + e.getMessage());
return null;
});
示例说明
以下是两个使用CompletableFuture实现异步调用的示例:
示例一:异步调用API获取天气信息并展示
在本示例中,我们使用CompletableFuture异步调用API获取天气信息,并在获取到信息后将信息展示在控制台上。
public class WeatherApiCaller {
public static void main(String[] args) {
CompletableFuture.supplyAsync(WeatherApiCaller::getWeatherInfo)
.thenAccept(weatherInfo -> {
System.out.println("当前天气信息为:" + weatherInfo);
})
.exceptionally(e -> {
System.out.println("获取天气信息失败,异常信息为:" + e.getMessage());
return null;
});
// 可以继续执行其他任务,不需要等待天气信息获取完毕
}
private static String getWeatherInfo() {
String apiUrl = "https://api.weather.com.cn/data/sk/101010100.html";
String result = null;
try {
URL url = new URL(apiUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
conn.setRequestMethod("GET");
conn.setConnectTimeout(3000);
conn.setReadTimeout(3000);
if (conn.getResponseCode() == 200) {
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
result = sb.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
示例二:异步调用API获取多个结果并合并展示
在本示例中,我们使用CompletableFuture异步调用API获取多个结果并将结果合并展示。
public class MultiApiCaller {
public static void main(String[] args) {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> getApiResultByType("type1"));
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> getApiResultByType("type2"));
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> getApiResultByType("type3"));
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);
allFutures.thenRun(() -> {
System.out.println("所有结果获取完毕,展示结果如下:");
try {
System.out.println("type1 result:" + future1.get());
System.out.println("type2 result:" + future2.get());
System.out.println("type3 result:" + future3.get());
} catch (InterruptedException | ExecutionException e) {
System.out.println("获取结果失败,异常信息:" + e.getMessage());
}
});
// 可以继续执行其他任务,不需要等待所有结果获取完毕
}
private static String getApiResultByType(String type) {
String apiUrl = "https://xxxx/api/" + type;
String result = null;
try {
URL url = new URL(apiUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
conn.setRequestMethod("GET");
conn.setConnectTimeout(3000);
conn.setReadTimeout(3000);
if (conn.getResponseCode() == 200) {
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
result = sb.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
以上就是Java多线程实现异步调用的方法的完整攻略,如果还有疑问,请随时提出。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程实现异步调用的方法 - Python技术站