场景题之最快返回结果
问题描述
输入中文,最快从百度翻译、谷歌翻译、有道翻译获取结果返回。
代码实现
思路:采用CompletableFuture实现,多个CompletableFuture可以串行执行,也可以并行执行。其中anyOf()方法只要任意一个返回结果,就完成操作。
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
public class FastestResult {
public static void main(String[] args) {
String zh = "中国";
System.out.println(getResult(zh));
}
private static Object getResult(String zh) {
AtomicReference<Object> res = new AtomicReference<>("");
// 从三处获取结果
CompletableFuture<String> baidu = CompletableFuture.supplyAsync(() -> getFromBaidu(zh));
CompletableFuture<String> google = CompletableFuture.supplyAsync(() -> getFromGoogle(zh));
CompletableFuture<String> youdao = CompletableFuture.supplyAsync(() -> getFromYoudao(zh));
// 只要任意一个返回结果,就完成操作
CompletableFuture<Object> result = CompletableFuture.anyOf(baidu, google, youdao);
result.thenAccept(res::set);
// 阻塞获取结果,否则主线程关闭,CompletableFuture默认使用的线程池会立刻关闭
result.join();
return res.get();
}
static String getFromBaidu(String zh) {
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
return "baidu: " + zh;
}
static String getFromGoogle(String zh) {
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
return "google: " + zh;
}
static String getFromYoudao(String zh) {
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
return "youdao: " + zh;
}
}