老大问个问题

来源:5-1 不可变对象-1

Sivel

2018-05-03

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

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

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


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

写回答

1回答

Jimin

2018-05-03

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

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

0
3
Sivel
回复
Jimin
嗯呢,谢谢老大答疑解惑
2018-05-03
共3条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程