V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
tghoul
V2EX  ›  问与答

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

  •  
  •   tghoul · Apr 14, 2020 · 2275 views
    This topic created in 2204 days ago, the information mentioned may be changed or developed.

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

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

    但是他把服务器的请求线程又汇聚在线程池的队列里 又在里面 get() 其实是更慢了
    changePro
        15
    changePro  
       Apr 14, 2020
    垃圾代码!
    ffw5b7
        16
    ffw5b7  
       Apr 14, 2020 via Android
    萌新想问一下,为什么现在不用 WebFlux 类似的并发框架,而是加机器?
    zwx327634
        17
    zwx327634  
       Apr 14, 2020
    @ffw5b7 几十上百甚至上千的服务,升级到异步框架,成本挺高的。调用方使用异步也挺好
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3379 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 12:53 · PVG 20:53 · LAX 05:53 · JFK 08:53
    ♥ Do have faith in what you're doing.