猿问

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;
    }
眼眸繁星
浏览 3831回答 6
6回答

一只名叫tom的猫

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

宝慕林4294392

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

哆啦的时光机

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

繁花不似锦

如果Result是不可变的,就不会有问题。否则最好是拷贝一份给线程用,原来那份输出到jsonObject中。 另外,实际应用中最好用线程池代替Thread类。

POPMUISE

可以看一下Spring的@Async注解,不建议自己手写多线程代码(就这个需求而言)。
随时随地看视频慕课网APP

相关分类

Java
我要回答