在多线程中为什么要使用sleep()、 wait()、 notify()等函数?有何作用?不使用行不?同步不是使用synchronized()函数就可以了吗?

解决方案 »

  1.   

    sleep()使线程睡过去,也就是暂停执行,wait()是线程等待事件的发生,如果你的线程需要某个条件才能继续运行,就用wait(),他不占资源,notify()通知相应的在等待的线程条件已经满足,可以启动了,采用wait()的线程只能够通过notify或者是notifyAll()启动,不能够自己启动的.
      

  2.   

    http://blog.csdn.net/treeroot/archive/2004/11/10/175508.aspx
    http://blog.csdn.net/treeroot/archive/2004/11/11/176976.aspx
      

  3.   

    sleep()、 wait()、 notify()与synchronized()没有多大关系
      

  4.   

    当你synchronize 锁住一个对象的时候,在莫些时候你想要等待某个条件成立再执行你的代码,比如, 你从缓冲区中取数据,但是如果缓冲区中还没有数据呢?
    这个时候,你就要用wait,释放这个对象的锁(如果不释放,其他线程也没有办法往缓冲区中写)。等到其他线程写过缓冲后,调用notify通知你。
         synchronized(buffer) {
                  while (isEmpty(buffer)) 
                         wait();
                   ...
        }
      

  5.   

    回复人: batfree(Batfree)
    sleep()使线程睡过去,也就是暂停执行,或者让出cpu给别的线程使用..
    wait()是线程等待事件的发生,如果你的线程需要某个条件才能继续运行,就用wait(),他不占资源,只是不运行线程而已 等待命令的意思
    notify()通知相应的在等待的线程条件已经满足,可以启动了,采用wait()的线程只能够通过notify或者是notifyAll()启动,不能够自己启动的.synchronized()函数,与wait() notify()等没有关系,他就像数据库中的防止死锁一样的一个函数http://www.kupage.com/webdesign/8/20040329/1720170000027tkg9w74.htm
    这里比较详细 建议搂主看看!!!
      

  6.   

    http://blog.csdn.net/treeroot/archive/2004/11/10/175508.aspx
    http://blog.csdn.net/treeroot/archive/2004/11/11/176976.aspx
      

  7.   

    JAVA采用了Monitor线程模型synchronized解决同步问题,也就是共享资源/数据一次只能让一个线程使用,其它的等着wait/notify是为了解决生产者消费者的问题,但是也是共享资源的问题(共享库存数据),消费者减库存,生产者加库存,所以使用wait/notify首先要在synchronized区(也就是要先获得对象锁),但是不同的是,synchronized不会和共享资源/数据有关,它只保证一次只能让一个线程使用就行了,但是生产者消费者的同步问题还和共享资源/数据有关,如果消费者线程一看没有库存了就要Wait生产者加库存,生产者在加了库存后notify消费者
    (wait调用后会释放对象锁,为什么可以释放对象锁,因为它不会运行代码了,不会竞争资源/数据,让其它消费者也能进来等候,当它的线程被notify返回时,它将重新获得对象锁,就象它wait前的状态一样)