1.线程池的了解?都有哪些线程池?
(他这个问题我回答了都有哪些线程池,仔细思考其实,你应该从个个方面去回答如:
线程池的优点有:
- 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁带来的消耗。
- 提高响应速度:当任务到达时,任务可以不需要等待线程创建就能立即执行。
- 提高线程的可管理性:使用线程池可以统一进行线程分配、调度和监控。
java创建线程池的四种方式:
- newCachedThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收,则新建线程
- newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
- newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行
- newSingleThreadExecutor 创建一个单线程化的线程池,它只会唯一的工作线程来执行任务,保证所有任务按照指定.
线程池的参数以及方法策略:
重要参数: (7个)
- CorePoolSize:核心线程数量
- MaximumPoolSize:最大线程数
- keepAliveTime 当线程池线程数量大于corePoolSize时候,多出来的空闲线程,多长时间会被销毁。
- TimeUnit:空闲线程的保留时间单位(*详细点可说可不说)
- TimeUnit.DAYS; //天
- TimeUnit.HOURS; //小时
- TimeUnit.MINUTES; //分钟
- TimeUnit.SECONDS; //秒
- TimeUnit.MILLISECONDS; //毫秒
- TimeUnit.MICROSECONDS; //微妙
- TimeUnit.NANOSECONDS; //纳秒
- WorkQueue:任务缓存队列,用于存放提交但是尚未被执行的任务
- ThreadFactory:线程工厂,主要用来创建线程
- Handler:饱和处理策略(拒绝策略)
饱和处理策略?一般会问你Handler你了解多少?(这样他的思路就会顺着你的思路走,你掌握了主动权)
饱和处理策略:
- ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,JDK默认采用此策略。
- ThreadPoolExecutor.DiscardPolicy:不处理,丢弃新任务,但是不抛出异常。
- ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最近的任务,然后重新尝试执行任务(重复此过程)
- ThreadPoolExecutor.CallerRunsPolicy:等待调用者线程空闲后执行任务。调用者线程:假设在线程A中创建线程池,线程A就是调用者线程
2.线程进入线程池的执行流程?(也就是线程池的工作原理
线程状态
- 新建
new语句创建的线程对象处于新建状态,此时它和其他java对象一样,仅被分配了内存。 - 等待
当线程在new之后,并且在调用start方法前,线程处于等待状态。 - 就绪
当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态。处于这个状态的线程位于Java虚拟机的可运行池中,等待cpu的使用权。 - 运行状态
处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。只有处于就绪状态的线程才有机会转到运行状态。 - 阻塞状态
阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才会有机会获得运行状态。
阻塞状态分为三种:
(1)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(2)、同步阻塞:运行的线程在获取对象同步锁时,若该同步锁被别的线程占用,则JVM会把线程放入锁池中。
(3)、其他阻塞:运行的线程执行Sleep()方法,或者发出I/O请求时,JVM会把线程设为阻塞状态。当Sleep()状态超时、或者I/O处理完毕时,线程重新转入就绪状态。
- 死亡状态
当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡
状态,该线程结束生命周期。
运行过程:
首先判断核心线程池里的线程是否都在执行任务,如果不是则直接从核心线程池中创建一个线程来执行,如果都在忙则判断任务队列是否也满了,没满的话将任务放进去等待执行,满了就判断线程池的全部线程是否都在忙,如果都在忙就交给饱和策略来处理,否则就创建一个线程来帮助核心线程处理任务。
https://blog.csdn.net/lchq1995/article/details/85230399(具体看这个博客)