Java CompletableFuture和Thread.currentThread()中断()

Java CompletableFuture和Thread.currentThread()中断(),java,Java,我有一个带有超时的CompletableFuture方法: public List<User> findUsers() { final CompletableFuture<List<User>> future = new CompletableFuture<>(); // code with future.complete(users); ... try { return future.get(2000, TimeUnit.SECON

我有一个带有超时的
CompletableFuture
方法:

public List<User> findUsers() {
final CompletableFuture<List<User>> future = new CompletableFuture<>(); 

// code with future.complete(users);
...

try {
    return future.get(2000, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
    Thread.currentThread().interrupt();
    e.printStackTrace();
    return null;
    }
}
findUsers()
引发超时异常,并因其catch子句中断线程,然后
findTasks()
引发以下错误:

java.lang.InterruptedException
    at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:385)
    at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2093)
如果我使用

public List<Task> findTasks() {
    final CompletableFuture<List<Task>> future = new CompletableFuture<>(); 

    // code with future.complete(task);
    ...
    return future.join();
}
公共列表findTasks(){
最终CompletableFuture=新的CompletableFuture();
//未来代码。完成(任务);
...
返回future.join();
}

相反,它工作无误。但是,我如何才能使它在这两种方法上使用
future.get()
和超时?

如果使用
catch(ExecutionException | TimeoutException e){e.printStackTrace();return null;}catch(interruptedeexception e){Thread.currentThread().interrupt();e.printStackTrace();return null;}
,换句话说,捕获
ExecutionException
TimeoutException
时,为什么要中断线程?通常情况下,只有一个线程在捕捉到
InterruptedException
后(重新)中断线程,因为在抛出异常之前,线程的中断状态已清除。这允许后续代码在需要时对中断作出反应。这取决于你的设计;如果您不需要后续代码对中断做出反应,请不要重新中断线程。很抱歉,我不理解您的问题,以及为什么要调用
thread.currentThread().interrupt()?@Deadpool我必须调用
Thread.currentThread().interrupt()中断异常
或?内执行code>,这与您应该执行的操作完全相反。你的方法没有资格处理它。除了打印堆栈跟踪并抑制它之外,您无法执行任何操作。如果线程被中断,让调用方决定正确的操作过程。(想象一下,如果InputStream.read方法没有
抛出IOException
,并且您无法知道读取是否失败或成功。)
java.lang.InterruptedException
    at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:385)
    at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2093)
public List<Task> findTasks() {
    final CompletableFuture<List<Task>> future = new CompletableFuture<>(); 

    // code with future.complete(task);
    ...
    return future.join();
}