springMVC的controller请求是否新开一个线程?

有个请求是操作是比较耗时,我想在controller方法里新开启一个线程去单独处理耗时的那部分操作。这样做会不会导致线程安全的问题?

//类似于这样的代码
@PostMapping("/audit")
    public Object audit(@RequestBody Data data){
        JSONObject jsonObject = new JSONObject();

        Result result = serviceA.a(data);
        if(result!=null){
            jsonObject.put("code",200);
            jsonObject.put("data",result);
            jsonObject.put("message","审核成功");
            jsonObject.put("success",true);

            //耗时操作
            Thread t=new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        serviceA.b(result);
                        System.out.println("耗时操作");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            t.start();
        }else {
            jsonObject.put("code",400);
            jsonObject.put("message","审核失败");
            jsonObject.put("success",false);
        }
        return jsonObject;
    }
阅读 18.6k
6 个回答

可以看一下Spring的@Async注解,不建议自己手写多线程代码(就这个需求而言)。

你的serviceA.b(result)的结果也要传回给客户端吗?
如果是的话,你这样写是不行的,只能阻塞等待b返回。

如果不是那就应该使用异步消息,在另外的地方处理。

新手上路,请多包涵

只有多个线程之间需要对共享变量访问或操作时, 才有线程安全问题

serviceA.b(result); 会不会修改 result,如果会的话,那么 HTTP的输出是不确定的。如果不会修改,那么是没有问题的

这个和线程安全无关。 但是这写, 每次进入这个controller, 都会有 线程的创建和销毁, 会有性能问题

如果Result是不可变的,就不会有问题。否则最好是拷贝一份给线程用,原来那份输出到jsonObject中。

另外,实际应用中最好用线程池代替Thread类。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题