吴大宝藏男孩 2019-08-14 16:03 采纳率: 50%
浏览 260
已采纳

Future Callable 处理子线程无效

由于要获取线程中的返回值,所以将new thread (() - > {}) 里面的代码想用future来写。

        但是改完之后,调用方法之后,整个页面直接卡住,难道future不应该是另起一个线程吗?

求助。

同样的执行代码,我放在new thread()里面就是能正常调用。而且也不会影响页面的其他功能

代码如下:

private ExecutorService executorService = WorkThreadPoolConstants.WORK_POOL_INSTANCE;

@Transactional
    public String rebuildAccountSet() {

        if(isrebuildAccountSet == true) {
            log.info("正在执行重建任务,忽略本次请求");
            return "提示1";
        }

        synchronized(this) {
            if(isrebuildAccountSet == true)
                return "提示2 " ;

            isrebuildAccountSet = true;

            Task task = new Task();
            FutureTask<String> futureTask = new FutureTask<String>(task);
            executorService.submit(futureTask);

            //让子线程飞一会
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }

            try {
                return (String) futureTask.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
        return "";  
    }

    class Task implements Callable<String>{
        @Override
        public String call() throws Exception {

            //很耗时,大约30分钟左右的执行时间,频繁的写入数据到数据库
                //调用到了内部的方法
        }
    }
  • 写回答

1条回答 默认 最新

  • yyjjttww 2019-08-14 16:16
    关注

    futureTask.get()是会阻塞的啊。。。
    这个方法点进源码去看。。
    如果任务未完成会调用
    awaitDone(false, 0L) 一直阻塞;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境