java多线程面试总结

创建线程的方式有哪些?

1.继承Thread类,重写run方法。2.实现Runnable接口,实现run方法。3.实现Callable接口,实现call方法,结合FutureTask。(可以获取线程的返回值)4.线程池创建线程。

线程的状态?

new创建线程是新建状态;执行.start(),进入可执行状态,获取到cup执行权力,就运行;若没有获取锁资源,会进入阻塞状态;执行wait方法,等待状态(需要手动唤醒,释放锁资源);执行sleep方法,计时等待状态;run方法执行完成,死亡状态。

java中wait与sleep方法的不同?

相同点:wait与sleep都会让线程放弃cup的执行权力,进入阻塞状态。

不同点:wait方法是Object类中的,执行wait方法需要手动用notify或notifyAll唤醒;wait方法必须先获取对象锁才能执行;wait方法释放锁对象。sleep是Thread的静态方法;sleep不需要手动唤醒,到时间自动唤醒;sleep是静态方法,所以无需锁就可以执行;sleep不释放锁。

synchronized关键字底层原理?

synchronized采用互斥的方式让同一时刻最多只有一个线程获取锁。它底层由Monitor实现,Monitor中有三个属性,onwer,entrylist,waitset。当来一个线程的时候,先判断onwer是否有关联获取锁的线程,没有直接关联当前线程,若有,则进入entrylist(存放没有获取锁而阻塞的线程);如果执行了wait,sleep方法,进行waitset(进入等待状态的线程);

synchronized锁的形式?

Synchronized是一种互斥锁,同一时刻最多一个线程获取锁。

Synchronized锁有三种形式,分别为重量级锁、轻量级锁、偏向锁。

重量级锁:多线程环境中发生竞争,synchrinized锁就为重量级锁,底层是monitor实现的(jvm对象)

轻量级锁:多线程环境中,没有竞争锁,线程是错开时间加锁。一个线程获取锁,然后释放,下一个线程再获取锁释放。

偏向锁:很长一段时间内,一个线程多次获取同一个对象锁。

线程池的核心参数?

核心线程数

最大线程数(临时线程数=最大线程数-核心线程数)

临时线程最大存活时间

临时线程最大存活时间单位

阻塞队列 (ArrayBlokingQueue,LinkedBlokingQueue)

线程工厂

拒绝策略 (直接抛出异常(默认);直接删除队列中第一个任务;直接放弃当前任务;用主线程执行)

流程:当来一个任务时,会先判断核心线程是否没有空闲的。若有空闲的,交给核心线程执行;若没有,会判断阻塞队列是否满了。若阻塞队列没有满,进入阻塞队列;若满了,新建临时线程。若达到最大线程数,则会触发拒绝策略。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值