CompletableFuture.supplyAsync 多线程异常捕获

CompletableFuture.supplyAsync多线程异常捕获

/**
     * 保存错误信息
     */
    public volatile RuntimeException error =  null;
    
    /**
     * 自动发起流程
     * synchronized 保证对error的修改不会被其他因素影响
     */
    @Override
    public synchronized void autoMakeProcess() {
        error = null;
        CompletableFuture.supplyAsync(() -> {
long t1 = System.currentTimeMillis();
            log.info("自动发起流程任务开始");
            safetyComplianceProcessAutoService.plmNewItemStartProcess();
            safetyComplianceProcessAutoService.checkTimeOutStartProcess();
            log.info("自动发起流程任务结束,耗时:{}ms", (System.currentTimeMillis() - t1));
            return true;
        }).exceptionally( e -> {
            if (e != null) {
                log.error("autoMakeProcess error:", e);
                error = new RuntimeException(e);
            }
            return null;
        });
        if (!ForkJoinPool.commonPool().awaitQuiescence(1, TimeUnit.HOURS)) {
            log.error("autoMakeProcess error:  任务执行超时");
        }
        //如果有异常 抛出异常
        if(error != null){
            throw error;
        }
    }

 

posted @ 2023-02-14 14:13  java架构师1  阅读(367)  评论(0)    收藏  举报