多线程编程中,一般线程的个数都大于 CPU 的核心个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效的执行,通常 CPU 采取的策略是:为每个线程分配时间片 + 轮转的形式。当线程的时间片用完时,CPU 就会重新处于就绪状态,并让其他线程使用,这整个过程就属于一次上下文切换。
当前任务在执行完 CPU 时间片并切换到另一个任务之前,会先保存自己的状态,以便下一次再切换回这个任务时,可以再次加载这个任务的状态。任务从保存到再加载的过程,就是一次上下文切换。
Linux 相比于其他操作系统(包括类 Unix 系统)有很多的优势,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。
Thread.sleep()
方法和 Object.wait()
方法的区别和共同点?Object.wait()
Object.wait(long timeout)
Thread.sleep()
Thread.start()
可以观察到,最终执行的都是 native 方法
Thread.start()
方法时会执行 run()
方法,为什么不能直接调用 run()
方法?new Thread() 后,线程进入新建状态;调用 start() 方法,相当于启动线程并使线程进入就绪状态,从操作系统分配到时间片后,线程才开始正式运行。start() 会执行线程的相应准备工作,然后自动执行 run() 方法中内容,这是真正的多线程工作;而直接执行 run() 方法,会把 run() 方法当成 main 线程下的普通方法来执行,并不会另起个线程来执行,因此这并不是多线程工作方式。