为什么 wait() 要放在同步代码块中?
同步方法就是在方法前加关键字 synchronized,然后被同步的方法一次只能有一个线程进sleep()方法和wait()方法的异同点
相同之处:
sleep()方法和wait()方法都是使当前线程进入休眠状态。 两者都可以响应**interrupt****中断,也就是说在线程调用方法进入休眠状态后,如果收到中断信号,都可以进行响应并中断,且都可以抛出InterruptException 异常。
不同之处:
1,所属类不同:
sleep()
方法属于
Thread
类的静态方法,而
wait()
方法属于Object类。
为什么 wait() 定义在 object 里,*而不是 Thread类’//‘里?
Java
的锁是对象级别的锁,而不是线程级别,所以
wait()
是
Object
的方法。
sleep()
是线程级别的,所以存在于
Thread
类中。
2,唤醒方式不同:
sleep()
方法必须传递一个超时时间的参数,过了这个时间后线程就会自动唤醒,进入就绪状态;
而
wait()
方法可以不传递参数,此时线程会进入永久休眠,直到另一个线程调用notify()
方法或者
notifyAll()
方法之后,休眠的线程才会被唤醒。也就是说sleep()
方法可以
主动唤醒,而不传参的wait()
方法只能被动唤醒。
3,语法使用不同:
入,其他线程等待;防止在
cpu
切换线程的时候,其它线程先执行了notify()
,后执行
wait()
,线程永远无法被唤醒, 所以要将wait()
放在同步代码块。
4,释放锁资源不同:
在线程调用
wait()
方法时,线程会主动
释放
锁并进入等待状态; 而线程在调用sleep()
方法时,线程
不会释放锁
。 也就是说sleep()
方法是抱着锁睡的。
5,线程进入状态不同:
线程调用sleep()
方法会进入
TIMED_WAITING
有时限等待状态;而调用无参数的wait()
方法,线程会进入
WAITING
无时
限等待状态。