国产成人AV无码一二三区,少女1到100集,国产精品久久久久精品综合紧,巜公妇之诱感肉欲HD在线播放

文章 > java基础 > Java编写超时工具类

Java编写超时工具类

头像

小妮浅浅

2021-02-26 17:34:023505浏览 · 0收藏 · 0评论

我们在开发过程中,在进行时间操作时,如果在规定的时间内完成处理的话,有可能会回到正确的结果。否则,就会被视为超时任务。此时,我们不再等待(不再执行)的时间操作,直接向调用者传达这个任务需要时间,被取消了。

1、说明

java已经为我们提供了解决办法。jdk1.5带来的并发库Future类可以满足这一需求。Future类中重要的方法有get()和cancel()。get()获取数据对象,如果数据没有加载,则在获取数据之前堵塞,cancel()取消数据加载。另一个get(timeout)操作表明,如果timeout时间内没有得到,就会失败回来,不会堵塞。

利用泛型和函数式接口编写一个工具类,可以让超时处理更方便,而不用到处写代码。

2、实例

/**
 * TimeoutUtil <br>
 *
 * @author lys
 * @date 2021/2/25
 */
@Slf4j
@Component
@NoArgsConstructor
public class TimeoutUtil {
 
    private ExecutorService executorService;
 
    public TimeoutUtil(ExecutorService executorService) {
        this.executorService = executorService;
    }
 
    /**
     * 有超时限制的方法
     *
     * @param bizSupplier 业务函数
     * @param timeout     超时时间,ms
     * @return 返回值
     */
    public <R> Result<R> doWithTimeLimit(Supplier<R> bizSupplier, int timeout) {
        return doWithTimeLimit(bizSupplier, null, timeout);
    }
 
    /**
     * 有超时限制的方法
     *
     * @param bizSupplier   业务函数
     * @param defaultResult 默认值
     * @param timeout       超时时间,ms
     * @return 返回值
     */
    public <R> Result<R> doWithTimeLimit(Supplier<R> bizSupplier, R defaultResult, int timeout) {
 
        R result;
        String errMsg = "Null value";
        FutureTask<R> futureTask = new FutureTask<>(bizSupplier::get);
        executorService.execute(futureTask);
        try {
            result = futureTask.get(timeout, TimeUnit.MILLISECONDS);
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            errMsg = String.format("doWithTimeLimit执行超过%d毫秒,强制结束", timeout);
            log.error(errMsg, e);
            futureTask.cancel(true);
            result = defaultResult;
        }
        return of(result, errMsg);
    }
 
    /**
     * 随机耗时的测试方法
     */
    private String randomSpentTime() {
        Random random = new Random();
        int time = (random.nextInt(10) + 1) * 1000;
        log.info("预计randomSpentTime方法执行将耗时: " + time + "毫秒");
        try {
            Thread.sleep(time);
        } catch (Exception e) {
        }
        return "randomSpentTime --> " + time;
    }
 
    public static void main(String[] args) throws Exception {
        ExecutorService executorService = new ThreadPoolExecutor(1, 1,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>(),
                runnable -> {
                    Thread thread = new Thread(runnable);
                    // 以守护线程方式启动
                    thread.setDaemon(true);
                    return thread;
                });
        TimeoutUtil timeoutUtil = new TimeoutUtil(executorService);
        for (int i = 1; i <= 10; i++) {
            log.info("\n=============第{}次超时测试=============", i);
            Thread.sleep(6000);
            long start = System.currentTimeMillis();
            String result = timeoutUtil.doWithTimeLimit(() -> timeoutUtil.randomSpentTime(), 5000).getOrElse("默认");
            log.info("doWithTimeLimit方法实际耗时{}毫秒,结果:{}", System.currentTimeMillis() - start, result);
        }
    }
 
}

以上就是Java编写超时工具类的介绍,希望能对大家有所帮助。更多Java学习指路:Java基础

关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

儿媳婉柔和父亲王大川的背景故事| 上课被同桌揉搓到高潮H| 白丝袜精华液抹在脚上的功效| 《漂亮的秘书HD》在线观看| 爸空电影完整版免费| CSGO高清大片免费播放器| 小莹的性荡生活第15章| 啵啵浏览器| 妈妈叫我戴上避孕套英文| 瑜伽馆里的私密按摩效果怎么样| 高三妈妈用性缓解孩子压力| 年轻的姐妹2| 合不拢腿(双)BY粗眉毛免费阅..| NYLONJP| 下面的小嘴又饿了| 麻豆| 女友小雪被教练猛烈进出视频| 美女和帅哥一起努力生产豆浆的视. | 生殖瑜伽| 销售的销售秘密3HD中字| 丫头把腿开大让我添添电影| 麻豆| 儿媳妇长太漂亮免费观看电视剧| 口咬的10个绝招图片| 老阿姨2免费播放电视剧| 麻豆 无码 国产在线观看| 农村真实亲子乱子伦| 女人被男人进入后的心理变化| 《再来一次好吗》日剧观看| 孤男寡女干柴烈火的下一句是什么 | 双男主MV大片| 少女与狗2在线观看免费版高清| 《黏糊糊的你》免费观看| 蜜桃成熟时在线观看| 风车动漫网| 舌头底下舔着有小硬疙瘩视频 | 日日精进久久为功的下一句是| 办公室狂C小雪秘书好爽H| 女性私处蹲下拍照有疙瘩| 热情的邻居2019| 《魅魔之耻》1~4集免费看