V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tghoul
V2EX  ›  问与答

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

  •  
  •   tghoul · 2020-04-14 17:43:54 +08:00 · 1515 次点击
    这是一个创建于 1470 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    @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;
    		}
    		
    	}
    }
    
    17 条回复    2020-04-14 19:25:26 +08:00
    Resource
        1
    Resource  
       2020-04-14 17:48:30 +08:00
    垃圾代码
    zzstar
        2
    zzstar  
       2020-04-14 17:49:06 +08:00
    这是啥,看不懂。
    zzstar
        3
    zzstar  
       2020-04-14 17:51:54 +08:00
    这难道是为了控制并发?
    sqfphoenix
        4
    sqfphoenix  
       2020-04-14 17:53:23 +08:00
    本意是想做单例的线程池吧,结果单例的实现方式是错误的
    这么上线程池只会降低并发量
    tghoul
        5
    tghoul  
    OP
       2020-04-14 17:53:51 +08:00
    @zzstar 我也不明白为啥在 controller 里面弄线程,给我看傻了
    shenjixiang
        6
    shenjixiang  
       2020-04-14 17:55:53 +08:00
    有用的,分批处理数据。注意这个参数:inSerialNum
    n770011
        7
    n770011  
       2020-04-14 17:56:46 +08:00
    依我的理解,代码应该就是依楼上所说控制并发。但实际应该没用。因为线程池是类的成员变量,除非 spring 容器设置成只有一个 AccessController 实例(我猜测是能设置的)。private ExecutorService pool = null;改成 private static ExecutorService pool = null;应该就能起到并发控制作用。
    zzstar
        8
    zzstar  
       2020-04-14 17:59:03 +08:00
    默认 Bean 是单例模式,这么写也可以控制并发吧。不过不知道为什么这么写
    wysnylc
        9
    wysnylc  
       2020-04-14 18:01:38 +08:00
    单例初始化没解决并发,线程池任务是串行
    总结:并发个锤子
    tghoul
        10
    tghoul  
    OP
       2020-04-14 18:01:53 +08:00
    @n770011 同事说用线程池是提高处理效率
    iffi
        11
    iffi  
       2020-04-14 18:13:28 +08:00
    LOL
    tghoul
        12
    tghoul  
    OP
       2020-04-14 18:13:58 +08:00 via Android
    @shenjixiang 这个只是生成一个流水号而已
    xhinliang
        13
    xhinliang  
       2020-04-14 18:18:02 +08:00
    垃圾代码
    zhady009
        14
    zhady009  
       2020-04-14 18:36:14 +08:00
    线程池初始化 bean 默认是单例所以这个一般没什么问题 不过也不太优雅

    但是他把服务器的请求线程又汇聚在线程池的队列里 又在里面 get() 其实是更慢了
    changePro
        15
    changePro  
       2020-04-14 18:40:29 +08:00
    垃圾代码!
    ffw5b7
        16
    ffw5b7  
       2020-04-14 18:50:32 +08:00 via Android
    萌新想问一下,为什么现在不用 WebFlux 类似的并发框架,而是加机器?
    zwx327634
        17
    zwx327634  
       2020-04-14 19:25:26 +08:00
    @ffw5b7 几十上百甚至上千的服务,升级到异步框架,成本挺高的。调用方使用异步也挺好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2900 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 15:19 · PVG 23:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.