本帖最后由 ameyume 于 2010-11-14 17:37:22 编辑

解决方案 »

  1.   

    没用wait,notify之前是点击下一首时,我都是重新new一个DelayThread(200);
    但这样连续点击下一首时,就死机了。
      

  2.   

    wait:等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则后收到一个 IllegalMonitorStateException,这个是运行时异常.调用这个方法后,就放弃了这个同步锁了.如果不带参数的wait方法就只 有等别人唤醒了,如果带一个参数的
    化就设置等待最长时间,过了这个时间即使没有人唤醒这个线程也不再等待了.
    notify:唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),但是notifyAll可以唤醒所有等待的线程,注意唤醒的时在notify之前wait的线程,之后的没有效果.
      

  3.   

    # 调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) {...} 代码段内。
      

  4.   

    synchronized(this)
    {
       try {
           dThread.wait(); // 暂停线程
       }catch(InterruptedException e) {
           e.printStackTrace();
       }
    }
    synchronized(this),会获得this的对象锁,dThread.wait()会让该调用线程wait在dThread对象的等待池中,然后该线程会释放dThread锁,由于线程没有dThread对象锁,所以会报IllegalMonitorStateException。同样的道理适合notify(),notifyAll().
    所以可以这样写:
    synchronized(dThread)
    {
       try {
           dThread.wait(); // 暂停线程
       }catch(InterruptedException e) {
           e.printStackTrace();
       }
    }
    synchronized(dThread)
    {
           dThread.notify(); // 恢复线程
    }
    wait的目的就在于暴露出对象锁,让其他线程可以通过对象的notify叫醒等待在该对象的等该池里的线程。同样notify也会释放对象锁,在调用之前必须获得对象的锁,不然也会报异常。