面试:线程和线程池

时间:2024-04-13 07:14:05

目录

目标

一、线程有哪些状态

1、新建态(NEW):

2、可运行态(RUNNABLE):

3、终结态(TERMINATED):

 4、阻塞态(BLOCKED):

5、等待态(WAITING):

6、有时限的等待(TIMED_WAITING):

1、获得有时限的wait(要释放锁)

2、调用线程的sleep方法(不释放锁)

二、按操作系统层面划分(五种状态)

三、线程池的核心参数(高频面试题)

1、corePoolSize(核心线程数):

2、maximumPoolSize(最大线程数目):

3、keepAliveTime(生存时间):

4、unit(时间单位):

5、workQueue

6、threadFactory(线程工厂):

7、handler(拒绝策略):


目标

  • 掌握Java线程的状态
  • 掌握Java 线程状态之间的转换
  • 辨析两种说法,六种状态 vs五种状态
  • 掌握线程池的主要参数

一、线程有哪些状态

新建态-->可运行态-->终结态(单向且不可逆)

1、新建态(NEW):

在新建一个线程时,它并不是一个真正的线程,只有在它调用了线程的start方法后,他就会由新建状态转换为可运行状态

2、可运行态(RUNNABLE):

这时候它真正与线程关联起来了,这时候它当中的代码就会交由操作系统分配给CPU执行

3、终结态(TERMINATED):

线程真正走到了尽头,底层所关联的线程和关联的相关资源也会得到释放。

 4、阻塞态(BLOCKED):

  • 线程在运行时,可能会发生多个线程争抢同一把锁,获取锁失败的线程就会进入阻塞态。
  • 在持锁线程释放锁的时候,就会唤醒阻塞的线程,然它们进行下一轮竞争锁的动作。
  • 这一轮竞争锁成功的线程就会恢复为可运行态;失败的线程仍然阻塞。

5、等待态(WAITING):

  • 线程在获得锁后去不满足条件,就会进入等待态,并且释放锁;在以后满足条件后再获得锁。
  • 但是之后它要重新去争抢锁。

6、有时限的等待(TIMED_WAITING):

1、获得有时限的wait(要释放锁

时间到了或者调用notify()都会唤醒。

2、调用线程的sleep方法(不释放锁

只有时间到了才会唤醒

二、按操作系统层面划分(五种状态)

  • 分到CPU时间的:  运行
  • 可以分到CPU时间的:  就绪
  • 分不到CPU时间的:  阻塞

注意:Java中的 RUNNABLE涵盖了就绪、运行、阻塞I/O

三、线程池的核心参数(高频面试题)

1、corePoolSize(核心线程数):

最多保留的线程数

2、maximumPoolSize(最大线程数目):

核心线程 + 救急线程

3、keepAliveTime(生存时间):

针对救急线程

4、unit(时间单位):

针对救急线程

5、workQueue

阻塞队列

6、threadFactory(线程工厂):

可以为线程创建时起个好名字

7、handler(拒绝策略):

(1)默认:ThreadPoolExecutor.AbortPolicy();

抛异常

(2)  ThreadPoolExecutor.CallerRunsPolicy();

让调用者自己处理任务,此时为主线程调用submit

所以该任务由主线程处理

(3)  ThreadPoolExecutor.DiscardPolicy();

直接丢弃任务,也不抛异常

(4)  ThreadPoolExecutor.DiscardOldestPolicy();

把队列中最老的任务丢弃。