上下文切换
多线程编程中一般线程的个数都大于CPU核心的个数,而一个CPU核心在任意时刻内只能被一个线程使用,为了让这些线程都能得到有效执行,CPU采取的策略时为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程属于一次上下文切换。
换句话说,当前任务在执行完CPU时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换会这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。
sleep()和wait()
最主要的区别是sleep()方法没有释放锁,而wait()方法释放了锁。
两者都可以暂停线程的执行。
wait()通常用于线程间交互/通信,sleep()通常用于暂停执行。
wait()方法被调用后,线程不会自动苏醒(除非超时),需要别的线程调用同一个对象上的notify()或notifyAll()方法。而sleep()方法执行完后,线程会自动苏醒。
start()和run()
为什么调用start()方法时会执行run()方法,为什么不能直接调用run()方法?
当我们new一个Thread时,线程进入了新建状态,调用start()方法,会启动一个线程并使线程进入就绪状态,等分到时间片后就可以开始运行了。
start()会执行线程的相应准备工作,然后自动执行run()方法的内容,这是真正的多线程工作。
而直接执行run()方法会把run方法当作一个main线程下的普通方法去执行,并不是在某个线程中执行它,所以这不是多线程工作。