美文网首页
线程池的不正确使用引发的问题

线程池的不正确使用引发的问题

作者: 缄默的石头 | 来源:发表于2017-11-01 20:54 被阅读116次

线程池的不正确使用引发的问题

public static void main(String[] args) throws InterruptedException {
        Cache<Long> cache = new Cache<Long>(() -> {
            TimeUnit.SECONDS.sleep(2);
            return 0l;
        }, 3, ChronoUnit.SECONDS);
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));
        for (int i = 0; i < 20; i++) {
            System.out.println("提交"+i);
            executor.submit(() -> {
                System.out.println(Thread.currentThread().getName() + ">>>>" + cache.get());
            });
        }
        System.out.println("提交完成");
        executor.shutdown();
        while (!executor.isTerminated()) {
        }
        System.out.println("over");
    }

描述:
使用线程池来执行任务,配置如下:
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));
执行了20个任务,始终没有看到<<提交完成>>,而且程序一直没有退出。

分析:
核心线程数是2,所以一开始会创建2个线程,使用ArrayBlockingQueue,边界为10,后来又创建了3个线程,这个时候如果在提交新的任务,就会执行拒绝策略,而默认的RejectHandler是AbortPolicy,是直接抛出异常,此时主线程已经中止了,无法执行shutdown操作。主线程中止了,但是为什么进程没有退出?是因为此时线程池里面的线程还没有回收,在存在非守护线程的情况下,jvm进程没法退出。过了半个小时,进程仍然没有退出,是因为core的值是2,也就是线程池会从5个线程回收到2个,但是会仍然存在两个线程的,所以一直无法退出。

修正:

  1. 更换拒绝策略,保证程序会执行到shutdown
  2. 修改核心线程数为0,保证抛出异常后,线程池会把所有执行完的线程回收,jvm进程自动退出

相关文章

  • 线程池的不正确使用引发的问题

    线程池的不正确使用引发的问题 描述:使用线程池来执行任务,配置如下:ThreadPoolExecutor exec...

  • 八、线程池剖析

    一、前置问题 线程的状态转换 为什么要使用线程池 线程池的继承体系 线程池使用的场景 线程数的设置规则 线程池的状...

  • Android基础(25)多线程(三) 线程池

    1)Java多线程引发的性能问题,怎么解决?2)线程池 。线程池有没有上限?3)Android线程有没有上限?4)...

  • InheritableThreadLocal还存在的问题

    [toc] 问题场景 我们使用线程时候往往不会只是简单的new Thread对象,而是使用线程池,当然使用线程池的...

  • Java并发包中线程池ThreadPoolExecutor原理探

    一、线程池简介 线程池的使用主要是解决两个问题:①当执行大量异步任务的时候线程池能够提供更好的性能,在不使用线程池...

  • 关于线程池的面试题

    问题 1. 为什么要使用线程池,线程池用什么用 2. 说说几种常见的线程池及使用场景newFixedThreadP...

  • J.U.C——线程池专题

    主要讨论以下问题: 认识Java线程池 线程池的种类,区别,和使用场景 线程池的工作流程 线程池几个参数的理解 分...

  • Java线程池的使用

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

  • java----线程池

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

  • 线程池解析第一章-源码解析

    线程池解析第一章-源码解析线程池解析第二章-线程池源码问题总结 线程池基本介绍 为什么要使用线程池 对于系统和服务...

网友评论

      本文标题:线程池的不正确使用引发的问题

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