在Java中,可以使用java.util.concurrent
包中的工具來處理異步調用的超時。以下是一些建議的方法:
CompletableFuture
的orTimeout
方法:import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class AsyncTimeoutExample {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 模擬長時間運行的任務
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "異步任務結果";
});
CompletableFuture<String> timeoutFuture = future.orTimeout(3, TimeUnit.SECONDS);
try {
String result = timeoutFuture.get();
System.out.println("異步任務結果: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
System.out.println("異步任務超時");
future.cancel(true); // 取消超時任務
}
}
}
ExecutorService
和Future
的get(timeout, unit)
方法:import java.util.concurrent.*;
public class AsyncTimeoutExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
// 模擬長時間運行的任務
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "異步任務結果";
});
try {
String result = future.get(3, TimeUnit.SECONDS);
System.out.println("異步任務結果: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
System.out.println("異步任務超時");
future.cancel(true); // 取消超時任務
} finally {
executor.shutdown();
}
}
}
在這兩個示例中,我們分別使用CompletableFuture
和ExecutorService
來執行異步任務,并設置超時時間。如果任務在指定的時間內未完成,將拋出TimeoutException
,我們可以捕獲該異常并取消任務。