sleep(),wait(),notify()的区别
- sleep() 方法的作用是在指定毫秒数内让当前正在执行的线程休眠(暂时停止)。这是一个静态方法,他只属于类本身,不属于该类其对象,也就是说sleep这个方法的调用方式是
Thread.sleep()
调用此方法需要捕捉Interrupted Exception 异常。它在调用的时候也是要在同步内的,即在synchronized关键字的代码块或者方法中调用。 wait()方法的作用是使当前执行代码的线程进行等待,停止在wait()所在的代码行,直到接到通知或被中断为止。只能在同步方法或在同步块中调用此方法,同步块:
synchronized()
{
......
Eat.wait();//执行完wait()后线程执行等待在此处,**同时释放对象锁**
......
}
-如果不在关键字synchronized作用范围内调用wait()方法,就会抛出Illegalmoniter State Exception 异常,但并不需要用try-catch捕捉-当线程等待在wait()代码行时 收到了interrupt异常导致线程终止,其对象锁也会被释放
方法notify()同wait()一样的同步调用方法,否则抛出异常也相同。该方法是用来通知那些可能等待该对象的对象锁的线程。执行完这行代码后,当前线程不会马上释放该对象锁,而是线程执行退出该synchnorized关键字的代码范围后,才释放对象锁。然后,那些被wait()住了的线程才能开始竞争该对象锁。
-notify()只唤醒一个线程,而notifyall()方法则唤醒所有等待该对象锁的线程,至于随机唤醒还是优先唤醒则取决于JVM
Thread.sleep()
和Object.wait()
都可以暂停当前线程释放CPU的控制权 主要的区别是object.wait()
同时还要释放对象锁。
-关于Synchronized-我个人可能不太准确的理解
- synchronized(this){}
:this 代表的是某个类的一个对象,所以其内存锁是针对该对象在不同线程内的互斥操作!
- synchronized(static XXX){}
:static 成员属于类所有,其内存空间为该类的所有对象所共有,所以对该类的静态成员加锁,相当于对该类的所有内存空间加锁,也就是对整个类加锁,该类的所有成员间均互斥,同一时间内只能有一个线程可以访问该类的对象。
2015年 10月28号 (更新)
关于线程状态:
New(新创建):
new Thread(...)
之后,start()之前的状态。Runnable(可运行):一旦调用了start(),线程就是这个状态了。
Blocked(被阻塞):暂停执行或着同时扔掉了对象锁
Waiting(等待):等待另一个线程给出抢夺对象锁的信号或者等待暂停的时间过去
Timed Waiting(计时等待):当结束计时的时候就可以回到运行状态
Terminated(被终止): run()结束或者因未捕获异常而被迫终止run()
可用getState()的方法查看线程的当前状态。
***以上所有内容作为本人学习积累,如有误,希望看得的朋友们尽情批评指教,对我学习有帮助的我都虚心接受。***