线程知识点
并发:同一时刻应对多件事情的能力。
并行:同一时刻动手做多件事情的能力。
守护线程也称服务线程,优先级较低。
通过setDaemon(true)来设置线程为守护线程。
操作系统线程状态:新建、就绪、运行、阻塞、死亡
Java线程状态:
- NEW:新建状态;
- RUNNABLE:运行状态,JAVA 线程把操作系统中的就绪和运行两种状态统一称为“运行中” ;
- BLOCKED:阻塞状态
- WAITING:等待状态
- TIMED_WAITING:超时等待状态
- TERMINATED:终止状态
线程池状态:
- RUNNING:正常的状态,接受新的任务,处理等待队列中的任务。
- SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。
- STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。
- TIDYING:所有的任务都销毁了,workCount 为 0,线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated()。
- TERMINATED:terminated()方法结束后,线程池的状态就会变成这个
线程池中 submit() 和 execute() 方法有什么区别?
- submit()有返回值,而execute()没有;
- submit()可以进行Exception处理;
多线程中 synchronized 锁升级的原理是什么?
在锁的对象头中有一个threadId字段,当第一次访问时threadId为空,jvm让其持有偏向锁,并将threadId设置为当前线程Id,再次进入的时候会判断threadId和当前线程Id是否一致,如果不一致则
升级偏向锁为轻量级锁。通过自旋一定的次数来获取锁,如果还没有获取到锁则升级轻量级锁为重量级锁。
锁升级的目的?
锁升级是为了降低锁带来的性能消耗。(JDK1.6之后才引入的)
synchronized 底层实现原理?
由一对 monitorenter/monitorexit 指令实现的
如果线程池里某个线程挂掉了,这个线程会被踢掉吗,线程池会有什么反应
当执行的是execute时,可以看到异常输出信息,执行submit时,异常信息没有输出。但是调用Future.get()方法时,可以捕获到异常。
线程池会把异常线程剔除,并重新创建一个线程放入线程池
线程异常时不会影响其他线程的正常执行。
作者:
不二尘
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。