
如题,线程的资料面试题看了一大堆,但是用的很少,大家平时是怎么使用的。上次我是在类里直接写了 static 的 ExecutorService 然后使用的,不知道对不对
1 justRua 2019-07-15 10:20:49 +08:00 ExecutorService 里面的构造的线程的队列是无界的,按照阿里手册上的说法是不推荐直接使用,在并发量不大时我是直接用用这个。。。公司项目里是用 spring 配置的线程池 ThreadPoolTaskExecutor,之前公司有用 ExecutorService,在上面包装了一层加了个 Semaphore,线程数量超过最大值时阻塞不让排队。 |
2 xiaoidea 2019-07-15 10:23:14 +08:00 没问题。 建议:1. 不要直接用 Executors 静态方法创建线程池,而是用 ThreadPoolExecutor 的构造方法创建。2. 用 guava 的 MoreExecutors#listeningDecorator 对线程池包装,后续很多 guava 的工具方法可以使用 |
3 lihongjie0209 2019-07-15 10:25:48 +08:00 @justRua 线程池本身就可以配置拒绝策略的, 为什么还要自己使用 Semaphore? |
4 lihongjie0209 2019-07-15 10:26:55 +08:00 最好是一个 jvm 一个或者两个线程池, 不要在类中实例化, 不然和裸使用线程没区别 |
5 justRua 2019-07-15 10:30:46 +08:00 @lihongjie0209 别人写好的,猜他意图应该是任务来了不让排队,也不让拒绝,就阻塞在那等待消费,感觉和 SynchronousQueue 有点类似吧,业务场景是做 ETL,提交的任务必须跑不能丢弃。 |
6 lihongjie0209 2019-07-15 10:43:12 +08:00 |
7 airfling 2019-07-15 11:19:37 +08:00 我的一般策略是一个应用一个,要么单例,要么全局。 |
8 JohnZorn 2019-07-15 12:25:34 +08:00 via Android 现在直接写 CompletableFuture 了。 |
9 Aresxue 2019-07-15 16:26:05 +08:00 使用 new ThreadPoolExecutor 创建 static 的线程池,线程池要共享的,不然和裸开线程区别不是很大,看情况有必要的话设置为 final 的而且是守护线程。 |
10 SkyLine7 2019-07-16 16:51:27 +08:00 自己写一个线程池工具类,包含和核心线程数,最大线程数,阻塞队列,拒绝策略....网上这东西很多的 |
11 qwertyegg 2019-07-19 23:52:26 +08:00 forJoinPool? ~~~java val forkJoinPool = ForkJoinPool(PARALLELISM) forkJoinPool.submit{ some_parallel_stream_job }.get() ~~~ |