首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

Java 中如何优雅的使用线程池

  •  
  •   liuxingchina · 66 天前 · 1962 次点击
    这是一个创建于 66 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,线程的资料面试题看了一大堆,但是用的很少,大家平时是怎么使用的。上次我是在类里直接写了 static 的 ExecutorService 然后使用的,不知道对不对

    11 回复  |  直到 2019-07-19 23:52:26 +08:00
        1
    justRua   66 天前
    ExecutorService 里面的构造的线程的队列是无界的,按照阿里手册上的说法是不推荐直接使用,在并发量不大时我是直接用用这个。。。公司项目里是用 spring 配置的线程池 ThreadPoolTaskExecutor,之前公司有用 ExecutorService,在上面包装了一层加了个 Semaphore,线程数量超过最大值时阻塞不让排队。
        2
    xiaoidea   66 天前
    没问题。
    建议:1. 不要直接用 Executors 静态方法创建线程池,而是用 ThreadPoolExecutor 的构造方法创建。2. 用 guava 的 MoreExecutors#listeningDecorator 对线程池包装,后续很多 guava 的工具方法可以使用
        3
    lihongjie0209   66 天前
    @justRua 线程池本身就可以配置拒绝策略的, 为什么还要自己使用 Semaphore?
        4
    lihongjie0209   66 天前
    最好是一个 jvm 一个或者两个线程池, 不要在类中实例化, 不然和裸使用线程没区别
        5
    justRua   66 天前
    @lihongjie0209 别人写好的,猜他意图应该是任务来了不让排队,也不让拒绝,就阻塞在那等待消费,感觉和 SynchronousQueue 有点类似吧,业务场景是做 ETL,提交的任务必须跑不能丢弃。
        6
    lihongjie0209   66 天前
    @justRua 既然提交的任务不能丢弃, 为什么不用无界队列?

    "线程数量超过最大值时阻塞不让排队。"

    这相当于使用 AQS 实现的 Semaphore 作为一个隐含的队列来用
        7
    airfling   66 天前
    我的一般策略是一个应用一个,要么单例,要么全局。
        8
    choice4   66 天前 via Android
    现在直接写 CompletableFuture 了。
        9
    Aresxue   66 天前
    使用 new ThreadPoolExecutor 创建 static 的线程池,线程池要共享的,不然和裸开线程区别不是很大,看情况有必要的话设置为 final 的而且是守护线程。
        10
    SkyLine7   65 天前
    自己写一个线程池工具类,包含和核心线程数,最大线程数,阻塞队列,拒绝策略....网上这东西很多的
        11
    qwertyegg   62 天前
    forJoinPool?

    ~~~java
    val forkJoinPool = ForkJoinPool(PARALLELISM)
    forkJoinPool.submit{
    some_parallel_stream_job
    }.get()
    ~~~
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3466 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 01:05 · PVG 09:05 · LAX 18:05 · JFK 21:05
    ♥ Do have faith in what you're doing.