Java系列之 超时任务处理方法

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。

前言

调用一些方法,进行一些比较耗时的操作时,如果时间超过了规定的时间。要做超时处理。


package A1多线程.B1超时处理.Demo1;

import org.apache.log4j.Logger;

import java.util.Random;
import java.util.concurrent.*;

/**
 * @author zyz
 * @version 1.0
 * @data 2023/11/14 9:52
 * @Description: 有些方法的执行 比较费时。执行时间 超过指定时间的时候 主动结束
 */
public class TimeoutProcessing {
    static final Logger log = Logger.getLogger(TimeoutProcessing.class); //创建日志对象 Logger

    private static ExecutorService executorService = Executors.newSingleThreadExecutor();

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String result = timeoutMethod();
        log.info("方法实际耗时:" + (System.currentTimeMillis() - start) + "毫秒");
        log.info("结果:" + result);

        try {
            Thread.sleep(3000);
            long start1 = System.currentTimeMillis();
            String result1 = timeoutMethod();
            log.info("方法实际耗时:" + (System.currentTimeMillis() - start1) + "毫秒");
            log.info("结果:" + result1);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    /**
     * 有超时时间的方法
     * @param
     * @return
     */
    private static String timeoutMethod() {
        String result = "默认";
        FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {

            @Override
            public String call() throws Exception {
                return unknowMethod();
            }
        });

        executorService.execute(futureTask);
        try {
            result = futureTask.get(2000, TimeUnit.MILLISECONDS); //2秒后,还未执行完。就当作超时
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            futureTask.cancel(true);
            result = "默认";
        }

        return result;
    }

    /**
     * 这个方法的耗时不确定
     * @return
     */
    private static String unknowMethod() {
        Random random = new Random();
        int time = (random.nextInt(10) + 1) * 1000;
        log.info("任务将耗时: " + time + "毫秒");
        try {
            Thread.sleep(time);
        } catch (Exception e) {
            // TODO: handle exception
        }
        return "获得方法执行后的返回值";
    }



}

Java系列之 超时任务处理方法_第1张图片

你可能感兴趣的:(java系列知识,java,开发语言)