Java实习生必会线程池知识点

1.线程池的了解?都有哪些线程池?

(他这个问题我回答了都有哪些线程池,仔细思考其实,你应该从个个方面去回答如:

线程池的优点有:

  1. 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁带来的消耗。
  2. 提高响应速度:当任务到达时,任务可以不需要等待线程创建就能立即执行。
  3. 提高线程的可管理性:使用线程池可以统一进行线程分配、调度和监控。

java创建线程池的四种方式:

  1. newCachedThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收,则新建线程
  2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
  3. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行
  4. 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你了解多少?(这样他的思路就会顺着你的思路走,你掌握了主动权)
    饱和处理策略:
  1. ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,JDK默认采用此策略。
  2. ThreadPoolExecutor.DiscardPolicy:不处理,丢弃新任务,但是不抛出异常。
  3. ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最近的任务,然后重新尝试执行任务(重复此过程)
  4. ThreadPoolExecutor.CallerRunsPolicy:等待调用者线程空闲后执行任务。调用者线程:假设在线程A中创建线程池,线程A就是调用者线程

2.线程进入线程池的执行流程?(也就是线程池的工作原理

线程状态

  1. 新建
    new语句创建的线程对象处于新建状态,此时它和其他java对象一样,仅被分配了内存。
  2. 等待
    当线程在new之后,并且在调用start方法前,线程处于等待状态。
  3. 就绪
    当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态。处于这个状态的线程位于Java虚拟机的可运行池中,等待cpu的使用权。
  4. 运行状态
    处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。只有处于就绪状态的线程才有机会转到运行状态。
  5. 阻塞状态
    阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才会有机会获得运行状态。

阻塞状态分为三种:
(1)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(2)、同步阻塞:运行的线程在获取对象同步锁时,若该同步锁被别的线程占用,则JVM会把线程放入锁池中。
(3)、其他阻塞:运行的线程执行Sleep()方法,或者发出I/O请求时,JVM会把线程设为阻塞状态。当Sleep()状态超时、或者I/O处理完毕时,线程重新转入就绪状态。

  1. 死亡状态
    当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡
    状态,该线程结束生命周期。

运行过程:
首先判断核心线程池里的线程是否都在执行任务,如果不是则直接从核心线程池中创建一个线程来执行,如果都在忙则判断任务队列是否也满了,没满的话将任务放进去等待执行,满了就判断线程池的全部线程是否都在忙,如果都在忙就交给饱和策略来处理,否则就创建一个线程来帮助核心线程处理任务。
*图()在这里插入图片描述
https://blog.csdn.net/lchq1995/article/details/85230399(具体看这个博客)

发布了12 篇原创文章 · 获赞 2 · 访问量 422

猜你喜欢

转载自blog.csdn.net/weixin_43308406/article/details/102990587