线程池用过吗?生产上你如何设置合理参数

线程池的拒绝策略你谈谈:

是什么:等待队列满了,线程池中的max线程也达到了,这时候我们就需要拒绝策略机制合理的处理这个问题。

JDK自带的拒绝策略:

  • AbortPolicy(默认):直接抛出RejectedExecutionException异常组织系统正常运行
  • CallerRunsPolicy:即不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务流量
  • DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务
  • DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案

你在工作中 单一的 / 固定数的 / 可变的 三种创建线程池的方法,你用哪个多?

我们生产中只能使用自定义的。
线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式
说明: Executors 返回的线程池对象的弊端如下:
1) FixedThreadPool 和 SingleThreadPool :
允许的请求队列长度为 Integer.MAX_VALUE ,可能会堆积大量的请求,从而导致 OOM 。
2) CachedThreadPool 和 ScheduledThreadPool :
允许的创建线程数量为 Integer.MAX_VALUE ,可能会创建大量的线程,从而导致 OOM 。

你在工作中是如何使用线程池的,是否自定义过线程池使用:

public static void main(String[] args) {
	ExecutorService threadPool = new ThreadPoolExecutor(2, 4, 5L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(2), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

    try {
        for (int i = 0; i < 7 ; i++) {
            threadPool.execute(() -> {
                System.out.println(Thread.currentThread().getName() + " doing job");
                try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}
            });
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        threadPool.shutdown();
    }
}

java.util.concurrent.RejectedExecutionException: Task com.suanfa.booking.ExecutorDemo$$Lambda$1/558638686@4dd8dc3 rejected from java.util.concurrent.ThreadPoolExecutor@6d03e736[Running, pool size = 4, active threads = 4, queued tasks = 2, completed tasks = 0]
	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
	at com.suanfa.booking.ExecutorDemo.main(ExecutorDemo.java:21)
pool-1-thread-1 doing job
pool-1-thread-2 doing job
pool-1-thread-3 doing job
pool-1-thread-4 doing job
pool-1-thread-1 doing job
pool-1-thread-2 doing job

合理配置线程池你是如何考虑的?

maximumPoolSize

  • CPU密集型
    CPU密集型也叫计算密集型,在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序
  • I/O密集型
    系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。I/O bound的程序一般在达到性能极限时,CPU占用率仍然较低

什么是CPU密集型、IO密集型?https://blog.csdn.net/youanyyou/article/details/78990156

一般的公式是 CPU密集型:CPU核数 + 1,I/O密集型:CPU核数 / 1-阻塞系数(0.8~0.9)
到底如何设置 Java 线程池的大小?https://blog.csdn.net/youanyyou/article/details/100644988
这里介绍了更复杂的公式
最后的最后,我们还是需要通过压力测试来进行微调,只有经过压测测试的检验,我们才能最终保证的配置大小是准确的。





System.out.println(Runtime.getRuntime().availableProcessors()); 查看CPU核心数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值