并发编程面试题

1、线程生命周期

1.1、5种状态

  1. 新建: 表示刚刚新建了线程,还未执行
  2. 就绪: 调用了start(),处于可运行状态,等待CPU分配资源
  3. 运行: 获得CUP执行资源,执行run()中的代码
  4. 阻塞: 执行中调用了像join()方法,或者执行过程中等待同步锁
  5. 死亡: 线程执行完毕

在这里插入图片描述

1.2、6种状态

在Thread类中有个内部枚举类 State ,在其中定义了6中线程状态。

在这里插入图片描述

我理解相当于把,就绪和运行状态合成了 ->RUNNEABLE(可运行状态),

将阻塞状态分成了-> BLOCKED (阻塞)、 WAITING(等待)、TIMED_WAITING(限时等待)个状态

  1. NEW(新建): 表示刚刚新建了线程,还未执行
  2. RUNNABLE(可运行): 当调⽤start()⽅法时,处于该状态,表示线程所需的⼀切资源都已经准备好了。
  3. BLOCKED(阻塞): 执行中调用了像join()方法,或者执行过程中等待同步锁
  4. WAITING(等待): 处于无时间等待状态
  5. TIMED_WAITING(限时等待): 处于有限的等待状态。
  6. TERMINATED(停止): 当线程执⾏完毕,就进⼊结束状态。

2、sleep()wait() 有什么区别?

wait:

  • wait()方法是Object类中的方法,
  • 使用wait()方法时线程会进入等待状态同时会释放锁,
  • 进入等待状态后只有调用 notify() 方法,线程才能重新回到可运行的状态,
  • wait()方法必须在同步代码块中使用,否则会抛出异常,我认为这个原因是只有线程有某个对象的独占锁,才能调用这个对象的wait(),notify()等方法

sleep:

  • sleep()方法是 Thread 类中的方法,
  • 调用 sleep()方法线程不会释放锁,
  • 等待时间结束后线程会重新进入到运行状态

3、synchronized 关键字

3.1、说说自己是怎么使用 synchronized关键字?

修饰实例方法: 作用于当前对象实例,在进入同步代码块之前需要获取当前对象实例的锁

3.2、说一说自己对于 synchronized 关键字的了解

  1. synchronize是 Java 的关键字,需要jvm实现
  2. synchronize关键字主要解决的是多个线程之间访问资源的同步性问题,保证被 synchronize 修饰的方法或者代码块只能被一个线程执行
  3. 早期版本 synchronize 的实现是依赖于操作系统的 Mutex Lock,挂起和唤醒都需要 操作系统帮忙完成,属于重量级锁,效率低
  4. 在 Java 6之后 官方对锁的实现进行优化,引入了 轻量级锁 等技术,

4、线程池

4.1、线程池原理知道吗?以及核心参数

  1. 最大线程数(maximumPoolSize):
  2. 核心线程数(corePoolSize):
  3. 活跃时间(keepAliveTime):
  4. 阻塞队列(workQueue):
  5. 拒绝策略(RejectedExecutionHandler):

1、当提交了一个新任务给线程池,线程池会根据 核心线程数 来创建若干个任务数量线程执行任务,

2、当任务数量超过了 核心线程数 时, 后续任务会进入 阻塞队列 排队

3、如果 阻塞队列 也满了,将会继续创建 最大线程数 数量的线程来执行任务,当任务都完成后, 核心线程数 之外的线程会等待 活跃时间 之后自动销毁

4、如果任务数量达到了 最大线程数 的数量, 且 阻塞队列 也是满状态, 接下来会根据不同的 拒绝策略 应对处理

在这里插入图片描述

4.2、 线程池的拒绝策略有哪些?

  1. 默认的策略是,直接丢弃任务,抛出异常 (AbortPolicy)
  2. 第二种是,用调用者的线程处理任务
  3. 第三种是,丢弃等待队列最旧的任务,执行当前任务
  4. 最后是,直接丢弃任务,同时不抛出异常
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值