老大问个问题
来源:5-1 不可变对象-1
Sivel
2018-05-03
总体环境 :返回成功,其中异步启动一个线程池 去进行音频转码的操作。Executor executor =
Executors.newFixedThreadPool(5, ……});
CompletableFuture.supplyAsync(() -> {……}, executor)
因为转码是必须要完成的,不可以丢弃队列中的消息。因此我选用的是newFixedThreadPool,可以无限的等待(虽然五个线程会暂时顶满cpu) 我看了您的视频老大用的semaphore,我感觉也可以用来实现这个功能。但是我Google了很久,也没有比对出来哪个方案更好,所以希望老大解释一下两种优劣,然后教授一个您认为更好的方法。
还有一个问题 ExecutorService 我看您每次都是用这个,并且最后关闭。但是Executor没有提供和关闭线程池有关的方法,而且我认为也并不需要,比如我这个转码服务需要一直开启,并不需要关闭连接池。我这么理解对吗?
写回答
1回答
-
你好,第一个问题,Executors.newFixedThreadPool点开源码,根据他调用的new ThreadPoolExecutor构造方法给定的参数去解释就可以了,两者一个是通过线程池自己的机制进行处理,一个是线程池额外引入其他的同步手段来做线程调度的,更适合做QPS精确调度。如果对qps没明显要求的话,Executors.newFixedThreadPool倒是更简单一些。
第二个问题,需要一直使用的线程池就没必要关了。唯一可以关的时候只有项目重启时,不过那时影响也不大了。
032018-05-03
相似问题