美文网首页
Java后台耗时任务思路

Java后台耗时任务思路

作者: 少寨主的互联网洞察 | 来源:发表于2019-01-24 11:12 被阅读0次

    前记

    我们在处理后台任务的时候,经常会遇到某个任务需要较长时间,没法及时给前台反馈结果的情况,此时我们希望前台查询或者刷新的时候给出当前任务的执行状态,而不是一直空耗阻塞着,由此诞生了以下思路,当然Spring已经提供了对应的框架实现,这里只是对这种思路的处理方式的一种探究

    • 耗时任务
    class DefaultTimeConsumingTast implements Callable{
            private String id;
            DefaultTimeConsumingTast(String id){
                this.id=id;
            }
            @Override
            public User call() {
                User user=new User();
                try {
                    Thread.currentThread().sleep(5000);
                    user.setAge(Integer.parseInt(id));
                    return user;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }
    
    • 状态查询响应
    @RequestMapping(value = "/getAge",method = RequestMethod.GET)
        @ResponseBody
        public User getUser1(@RequestParam("id")String id){
            User u=new User();
            u.setMessage("未完成");
            if(futures.containsKey(id)){
                Future<User> userFuture=futures.get(id);
                if(userFuture.isDone()){
                    try{
                        u=userFuture.get();
                        u.setMessage("已完成");
                    }catch (InterruptedException | ExecutionException e){
                        e.printStackTrace();
                    }
                    futures.remove(id);
                }
            }else{
                Future<User> future=exec.submit(new DefaultTimeConsumingTast(id));
                futures.put(id,future);
            }
            return u;
        }
    
    • 全局声明变量或对象
    ExecutorService exec= Executors.newFixedThreadPool(2);
    private static Map<String,Future<User>> futures=new HashMap<>();
    

    相关文章

      网友评论

          本文标题:Java后台耗时任务思路

          本文链接:https://www.haomeiwen.com/subject/uwlyjqtx.html