Java 发生超时后调用方法

Java 发生超时后调用方法,java,multithreading,timeout,Java,Multithreading,Timeout,我尝试在代码中实现超时。基本上我想启动超时,如果超时发生,它应该调用一个方法 Pseudocode way: in bar function start timeout ---> ( at background, if timeout occurs call foo() ) in foo function cancel timeout print something 超时发生后如何调用

我尝试在代码中实现超时。基本上我想启动超时,如果超时发生,它应该调用一个方法

Pseudocode way:
      in bar function
            start timeout    ---> ( at background, if timeout occurs call foo() )

      in foo function
            cancel timeout
            print something
超时发生后如何调用方法


编辑:我应该能够重新启动超时。

也许这可以回答你的问题

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Test {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new Task());

        try {
            System.out.println("Started..");
            System.out.println(future.get(3, TimeUnit.SECONDS));
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            System.out.println("Terminated!");
        }

        executor.shutdownNow();
    }
}

class Task implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep(5000); //It means 5 seconds
        return "Ready!";
    }
}
import java.util.concurrent.Callable;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.Future;
导入java.util.concurrent.TimeUnit;
导入java.util.concurrent.TimeoutException;
公开课考试{
公共静态void main(字符串[]args)引发异常{
ExecutorService executor=Executors.newSingleThreadExecutor();
Future=executor.submit(新任务());
试一试{
System.out.println(“已启动…”);
System.out.println(future.get(3,TimeUnit.SECONDS));
System.out.println(“完成!”);
}捕获(超时异常e){
System.out.println(“终止!”);
}
执行者。关机现在();
}
}
类任务实现可调用{
@凌驾
公共字符串调用()引发异常{
Thread.sleep(5000);//表示5秒
返回“准备好!”;
}
}
如果您有问题,请参考

对未来的解释: 未来表示异步计算的结果。提供了检查计算是否完成、等待其完成以及检索计算结果的方法。只有在计算完成后,才能使用方法get检索结果,如有必要,请阻塞,直到它准备就绪

取消是通过取消方法执行的。还提供了其他方法来确定任务是正常完成还是取消。一旦计算完成,就不能取消计算。如果为了可取消性而使用Future,但不提供可用的结果,则可以声明Future的类型,并作为基础任务的结果返回null


请参考此

可能有很多不同的方法来实现它

最简单的可能就是使用它,它允许您计划在将来某个时间执行
TimerTask


你也可以看一看,我相信它是
Executor
等价物。

你说的是线程吗???@Baadshah我不知道如何实现,如果唯一的方法是线程,好的,我是说线程。bar函数不是一个线程,您可以看一下,或者如果您使用的是Swing,@MadProgrammer,您可以给出一个示例代码或answer@user2353516可能类似于这一行
System.out.println(future.get(3,TimeUnit.SECONDS))是否正在睡觉?如果您认为这是适合您的答案,请选中并单击“批准”按钮接受此问题作为您的答案。谢谢,GBU