请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老大问个问题

总体环境 :返回成功,其中异步启动一个线程池 去进行音频转码的操作。Executor executor =
Executors.newFixedThreadPool(5, ……});  

CompletableFuture.supplyAsync(() -> {……}, executor)

因为转码是必须要完成的,不可以丢弃队列中的消息。因此我选用的是newFixedThreadPool,可以无限的等待(虽然五个线程会暂时顶满cpu)  我看了您的视频老大用的semaphore,我感觉也可以用来实现这个功能。但是我Google了很久,也没有比对出来哪个方案更好,所以希望老大解释一下两种优劣,然后教授一个您认为更好的方法。


还有一个问题  ExecutorService 我看您每次都是用这个,并且最后关闭。但是Executor没有提供和关闭线程池有关的方法,而且我认为也并不需要,比如我这个转码服务需要一直开启,并不需要关闭连接池。我这么理解对吗?

正在回答

1回答

Jimin 2018-05-03 15:15:21

你好,第一个问题,Executors.newFixedThreadPool点开源码,根据他调用的new ThreadPoolExecutor构造方法给定的参数去解释就可以了,两者一个是通过线程池自己的机制进行处理,一个是线程池额外引入其他的同步手段来做线程调度的,更适合做QPS精确调度。如果对qps没明显要求的话,Executors.newFixedThreadPool倒是更简单一些。

第二个问题,需要一直使用的线程池就没必要关了。唯一可以关的时候只有项目重启时,不过那时影响也不大了。

0 回复 有任何疑惑可以回复我~
  • 提问者 Sivel #1
    老大你是说 semaphore 更适合做QPS精准调度吗,为什么啊?当corePoolSize与
    maximumPoolSize的话  这是不是就和设置信号量没差别了
    回复 有任何疑惑可以回复我~ 2018-05-03 15:21:54
  • Jimin 回复 提问者 Sivel #2
    内部控制和外部控制当然不一样,只是你看到的效果可能会很相近而已
    回复 有任何疑惑可以回复我~ 2018-05-03 17:55:20
  • 提问者 Sivel 回复 Jimin #3
    嗯呢,谢谢老大答疑解惑
    回复 有任何疑惑可以回复我~ 2018-05-03 17:58:09
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信