首页  编辑  

Java执行一段代码并设定超时,超时后不阻塞继续执行下面的代码

Tags: /Java/   Date Created:
在Java中,你可以使用ExecutorService和Future来执行一段代码,并设置一个超时时间。如果在指定的时间内代码未完成,你可以继续执行下面的逻辑。
下面是一个示例代码:
import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<?> future = executor.submit(new Runnable() {
            @Override
            public void run() {
                // 在这里写你要执行的代码
                // 例如,执行一段耗时的操作
                try {
                    Thread.sleep(6000);  // 模拟耗时操作(6秒)
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        try {
            future.get(5, TimeUnit.SECONDS);  // 设置超时时间为5秒
        } catch (InterruptedException e) {
            // 当前线程被中断
            e.printStackTrace();
        } catch (ExecutionException e) {
            // 代码抛出异常
            e.printStackTrace();
        } catch (TimeoutException e) {
            // 超时异常,代码未在指定时间内完成
            System.out.println("代码执行超时");
            // 在这里写你要执行超时时的逻辑
        } finally {
            future.cancel(true);  // 取消任务
            executor.shutdown();  // 关闭线程池
        }

        // 在这里写你要执行的逻辑(代码未超时或超时后的处理)
    }
}
在上述代码中,我们使用ExecutorService创建一个单线程的线程池,并通过submit方法提交一个Runnable任务。然后,我们使用future.get()方法设置超时时间为5秒,等待任务执行完成。如果任务在指定时间内未完成,将抛出TimeoutException异常。

你可以在TimeoutException的处理代码块中编写你要执行的超时时的逻辑。最后,我们调用future.cancel(true)取消任务,并调用executor.shutdown()关闭线程池。