请教一个关于多线程的问题,我觉得这么写没有用。

2020-04-14 17:43:54 +08:00
 tghoul

新接手了一个项目,领导让熟悉一下,我看到同事以前写的代码,我看不懂线程为啥要这么用,我觉得这么做并不会提升性能吧,请各位大佬帮忙解答一下,谢谢。

@RestController
@RequestMapping("/dq")
public class AccessController extends BaseController {

	@Resource
	private IAccService iAccService;
	
	private ExecutorService pool = null;
	
	@RequestMapping(value = "/access")
	@ResponseBody
	public AccessDataRespDto qtApproveLoan(@RequestBody final AccessDataReqDto req) {
		
		if (pool == null) {
			pool = Executors.newFixedThreadPool(5);//设置线程池
		}
		
		Future<AccessDataRespDto> f = pool.submit(new Callable<AccessDataRespDto>() {
			@Override
			public AccessDataRespDto call() {
				log.info("指标计算请求参数: [" + JSON.toJSONString(req) + "]");
				String inSerialNum = GlobalConstant.DQ.concat(DateTools.getCurrentDate(DateTools.DATE_FORMAT2_8)).concat("_").concat(StringUtils.getUuid());
				DqOutAccessDomain da = iAccService.installAccessInfo(req, null, "指标处理中", inSerialNum);
				AccessDataRespDto resp = iAccService.getAccessInfo(req, da, inSerialNum);
				return resp;
			}
		});
		try {
			return f.get();
		} catch (Exception e) {
			log.error("执行准入请求发送异常! MESSAGE:" + e.getMessage());
			return null;
		}
		
	}
}
1672 次点击
所在节点    问与答
17 条回复
Resource
2020-04-14 17:48:30 +08:00
垃圾代码
zzstar
2020-04-14 17:49:06 +08:00
这是啥,看不懂。
zzstar
2020-04-14 17:51:54 +08:00
这难道是为了控制并发?
sqfphoenix
2020-04-14 17:53:23 +08:00
本意是想做单例的线程池吧,结果单例的实现方式是错误的
这么上线程池只会降低并发量
tghoul
2020-04-14 17:53:51 +08:00
@zzstar 我也不明白为啥在 controller 里面弄线程,给我看傻了
shenjixiang
2020-04-14 17:55:53 +08:00
有用的,分批处理数据。注意这个参数:inSerialNum
n770011
2020-04-14 17:56:46 +08:00
依我的理解,代码应该就是依楼上所说控制并发。但实际应该没用。因为线程池是类的成员变量,除非 spring 容器设置成只有一个 AccessController 实例(我猜测是能设置的)。private ExecutorService pool = null;改成 private static ExecutorService pool = null;应该就能起到并发控制作用。
zzstar
2020-04-14 17:59:03 +08:00
默认 Bean 是单例模式,这么写也可以控制并发吧。不过不知道为什么这么写
wysnylc
2020-04-14 18:01:38 +08:00
单例初始化没解决并发,线程池任务是串行
总结:并发个锤子
tghoul
2020-04-14 18:01:53 +08:00
@n770011 同事说用线程池是提高处理效率
iffi
2020-04-14 18:13:28 +08:00
LOL
tghoul
2020-04-14 18:13:58 +08:00
@shenjixiang 这个只是生成一个流水号而已
xhinliang
2020-04-14 18:18:02 +08:00
垃圾代码
zhady009
2020-04-14 18:36:14 +08:00
线程池初始化 bean 默认是单例所以这个一般没什么问题 不过也不太优雅

但是他把服务器的请求线程又汇聚在线程池的队列里 又在里面 get() 其实是更慢了
changePro
2020-04-14 18:40:29 +08:00
垃圾代码!
ffw5b7
2020-04-14 18:50:32 +08:00
萌新想问一下,为什么现在不用 WebFlux 类似的并发框架,而是加机器?
zwx327634
2020-04-14 19:25:26 +08:00
@ffw5b7 几十上百甚至上千的服务,升级到异步框架,成本挺高的。调用方使用异步也挺好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662370

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX