温馨提示×

java异步调用 如何处理超时

小樊
81
2024-11-24 00:19:38
栏目: 编程语言

在Java中,可以使用java.util.concurrent包中的工具来处理异步调用的超时。以下是一些建议的方法:

  1. 使用CompletableFutureorTimeout方法:
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); // 取消超时任务
        }
    }
}
  1. 使用ExecutorServiceFutureget(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();
        }
    }
}

在这两个示例中,我们分别使用CompletableFutureExecutorService来执行异步任务,并设置超时时间。如果任务在指定的时间内未完成,将抛出TimeoutException,我们可以捕获该异常并取消任务。

0