吴大宝藏男孩 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 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条