为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

眼眸繁星 2019-03-01 10:30:21
有个请求是操作是比较耗时,我想在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; }
查看完整描述

6 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

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

查看完整回答
反对 回复 2019-03-01
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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

查看完整回答
反对 回复 2019-03-01
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-03-01
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

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

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

查看完整回答
反对 回复 2019-03-01
?
POPMUISE

TA贡献1765条经验 获得超5个赞

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

查看完整回答
反对 回复 2019-03-01
  • 6 回答
  • 0 关注
  • 3830 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信