吴大宝藏男孩 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) 一直阻塞;

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

报告相同问题?

悬赏问题

  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码