多线程系列问题汇总

  1. 什么是上下文切换?

多线程编程中,一般线程的个数都大于 CPU 的核心个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效的执行,通常 CPU 采取的策略是:为每个线程分配时间片 + 轮转的形式。当线程的时间片用完时,CPU 就会重新处于就绪状态,并让其他线程使用,这整个过程就属于一次上下文切换。

当前任务在执行完 CPU 时间片并切换到另一个任务之前,会先保存自己的状态,以便下一次再切换回这个任务时,可以再次加载这个任务的状态。任务从保存到再加载的过程,就是一次上下文切换。

Linux 相比于其他操作系统(包括类 Unix 系统)有很多的优势,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。

  1. 说说 Thread.sleep() 方法和 Object.wait() 方法的区别和共同点?
  • 区别点:sleep() 方法没有释放锁,而 wait() 方法释放了锁;
  • 共同点:两者都是暂停线程的执行;wait() 通常用于线程间的交互/通信,sleep() 通常被用于暂停方法的执行;
  • wait() 方法调用后,线程不会自动苏醒,需要别的线程触发调用同个对象上的 notify() 或者 notifyAll() 方法来唤醒(但也不一定保证成功),或者使用 wait(long timeout) 方法,超时后线程会自动苏醒。sleep() 方法执行完后,线程会自动苏醒。
多线程系列问题汇总_第1张图片
Object.wait()
多线程系列问题汇总_第2张图片
Object.wait(long timeout)
多线程系列问题汇总_第3张图片
Thread.sleep()
多线程系列问题汇总_第4张图片
Thread.start()

可以观察到,最终执行的都是 native 方法

  1. 为什么调用 Thread.start() 方法时会执行 run() 方法,为什么不能直接调用 run() 方法?

new Thread() 后,线程进入新建状态;调用 start() 方法,相当于启动线程并使线程进入就绪状态,从操作系统分配到时间片后,线程才开始正式运行。start() 会执行线程的相应准备工作,然后自动执行 run() 方法中内容,这是真正的多线程工作;而直接执行 run() 方法,会把 run() 方法当成 main 线程下的普通方法来执行,并不会另起个线程来执行,因此这并不是多线程工作方式。

你可能感兴趣的:(多线程系列问题汇总)