线程知识点

并发:同一时刻应对多件事情的能力。

并行:同一时刻动手做多件事情的能力。

守护线程也称服务线程,优先级较低。

通过setDaemon(true)来设置线程为守护线程。

操作系统线程状态:新建、就绪、运行、阻塞、死亡

Java线程状态:

  1. NEW:新建状态;
  2. RUNNABLE:运行状态,JAVA 线程把操作系统中的就绪和运行两种状态统一称为“运行中”
  3. BLOCKED:阻塞状态
  4. WAITING:等待状态
  5. TIMED_WAITING:超时等待状态
  6. TERMINATED:终止状态

线程池状态:

  1. RUNNING:正常的状态,接受新的任务,处理等待队列中的任务。
  2. SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。
  3. STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。
  4. TIDYING:所有的任务都销毁了,workCount 为 0,线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated()。
  5. 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()方法时,可以捕获到异常。

  线程池会把异常线程剔除,并重新创建一个线程放入线程池

  线程异常时不会影响其他线程的正常执行。

 

posted @ 2020-09-28 09:50  不二尘  阅读(133)  评论(0编辑  收藏  举报