java学习笔记:sleep和wait的区别, sleep和yield的区别

3.7 sleep()和wait()有什么区别?
答:sleep()方法是线程类(Thread)的静态方法,导致此线程暂停执行指定时间,将执行机
会给其他线程,但是监控状态依然保持,到时后会自动恢复(线程回到就绪(ready)状态),因
为调用sleep 不会释放对象锁。wait()是Object 类的方法,对此对象调用wait()方法导致本线程放弃
对象锁(线程暂停执行),进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或
notifyAll)后本线程才进入对象锁定池准备获得对象锁进入就绪状态。
补充:这里似乎漏掉了一个作为先决条件的问题,就是什么是进程,什么是线程?为什么需要多线
程编程?答案如下所示:
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分
配和调度的一个独立单位;线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小
的能独立运行的基本单位。线程的划分尺度小于进程,这使得多线程程序的并发性高;进程在执行
时通常拥有独立的内存单元,而线程之间可以共享内存。使用多线程的编程通常能够带来更好的性
能和用户体验,但是多线程的程序对于其他程序是不友好的,因为它占用了更多的CPU资源。

3.8 sleep()和yield()有什么区别?
1)sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行
的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
2)线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)
状态;
3)sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
4)sleep()方法比yield()方法(跟操作系统相关)具有更好的可移植性。