疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

notofy和wati方法的理解


 

  Object中提供了5个方法来支持线程间的协作。它们都是public 和 final的。因此所有的类都有该5种方法,并且不能被复写(其实现为本地代码)。

  另外需要注意的是这些方法必须出现在同步语句块或者同步方法中。否则会抛出IllegalMoniterStateException异常。

  对于notify而言,虚拟机会随机唤醒等待区中的一个线程(如果等待区没有线程,则什么也不做)。

  对于notifyAll而言,虚拟机会唤醒全部线程(如果等待区没有线程,则什么也不做)。

  对于wait而言,该线程(已经拥有对象或者类的锁)会主动放弃对象或者类锁,进入等待区,等待其它线程唤醒。

  对于wait(long timeout)而言,该线程(已经拥有对象或者类锁)会主动放弃对象或者类锁,进入等待区,如果在给定毫秒时间内没有被其它线程唤醒,则在规定时间到时,虚拟机会自动唤醒该进程。

  对于wait(long timeout,int nanos)而言,它和上面那个方法类似,只不过唤醒时间多了个纳秒时间。

  如果一个同步方法或者同步语句块返回或者抛出异常,都会释放掉锁。

  对于进入等待区的线程来说,要使它正常结束,必须要被唤醒,然后执行监视区域的内容,最后离开监视区域。所以如果在同步方法或者同步语句块中调用了无参的wait方法,且没有其它线程对其唤醒,那么该线程永远也不会结束。因此该程序的虚拟机实例会永远运行着。就感觉死循环一样。