美文网首页
线程池注意事项

线程池注意事项

作者: 修行者12138 | 来源:发表于2021-02-27 18:27 被阅读0次

执行任务的时候,先使用corePoolSize范围内的线程,多出的任务放到阻塞队列,阻塞队列放满了,才会用maximumPoolSize范围内的线程。

如果阻塞队列设置成无界,有OOM的风险。

线程/线程池一定要起好名字,这样用jstack导出threaddump文件后,可以看出线程是在执行什么业务。

慎用showdownNow(),会直接把业务线程停掉,可能对业务造成影响。

自定义线程池,最好有固定的后缀,与框架的线程池区分开,这样jstack的时候可以grep 固定后缀,只看自定义线程的信息。

ExecutorService executorService = new ThreadPoolExecutor(10, 20, 0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingDeque<>(10), factory, new ThreadPoolExecutor.AbortPolicy());

线程池配置如上,如果有22个任务,第1-10个任务由核心线程跑,第11-20个任务放入阻塞队列,第21-22个任务由新建线程(或者释放cpu资源后的核心线程)跑,第21-22个任务的执行顺序,先于第11-20个任务。

当运行中的线程数已达到最大线程数,且阻塞队列已满时,对于新的任务,有以下策略
CallerRunsPolicy: 把新的任务交给main线程执行
DiscardPolicy: 直接舍弃
AbortPolicy: 抛异常,不影响其他线程的执行,该策略可能导致线程无法释放
DiscardOldestPolicy: 舍弃最旧的任务

public static void main(String[] args) throws Exception{
    ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("test-thread-pool-%d").build();
    ExecutorService executorService = new ThreadPoolExecutor(10, 20, 0L, TimeUnit.MILLISECONDS,
            new LinkedBlockingDeque<>(10), factory, new ThreadPoolExecutor.AbortPolicy());

    for (int i = 1; i <= 31; i++) {
        final int j = i;
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + ": " + j);
            }
        });
    }

    executorService.shutdown();
}

上述代码,线程无法正常释放,jstack导出的dump日志大量waiting on condition

相关文章

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • 2、ThreadPoolExecutor

    简单聊聊 ThreadPoolExecutor 的使用和注意事项,这里不涉及源码的分析。 一、创建一个线程池 参数...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

  • 线程池使用注意事项

    1.使用new ThreadPoolExecutor()创建线程池2.设置合理的线程数,x是计算时间,y是等待时间...

  • Spring Boot之ThreadPoolTaskExecut

    初始化线程池 corePoolSize 线程池维护线程的最少数量keepAliveSeconds 线程池维护线程...

  • 线程池

    1.线程池简介 1.1 线程池的概念 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性...

  • 多线程juc线程池

    java_basic juc线程池 创建线程池 handler是线程池拒绝策略 排队策略 线程池状态 RUNNIN...

  • ThreadPoolExecutor线程池原理以及源码分析

    线程池流程: 线程池核心类:ThreadPoolExecutor:普通的线程池ScheduledThreadPoo...

  • 线程池

    线程池 [TOC] 线程池概述 什么是线程池 为什么使用线程池 线程池的优势第一:降低资源消耗。通过重复利用已创建...

网友评论

      本文标题:线程池注意事项

      本文链接:https://www.haomeiwen.com/subject/izzgfltx.html