呵呵,没有见过不能唤醒的情况,除非你调用requestResume的时候正在dosomething里,还没有开始wait你可以用其他方法补偿,例如检测一个列表。

解决方案 »

  1.   

    拜托,死锁了关键字synchronized说明对象实例中只能有一个函数在运行,你的run函数中已经在运行requestSuspended了,如果你再运行requestResume,requestResume就会等待requestSuspended函数释放资源,而requestSuspended函数是在执行wait(),当然不可能释放资源了,这样不就死锁了
      

  2.   

    你把run函数中的requestSuspended();替换成
    try{
       wait();
    }catch(Exception e){
    }不就行了
      

  3.   

    不对,不对,刚才说错了。并没有死锁。虽然调用了同步方法requestSuspended,锁定了对象,但随即该方法执行了wait(),又释放了对象的锁。所以此时可以调用另一个同步方法requestResume最好把完整的程序贴上来。
      

  4.   

    wait()方法可以释放对象的锁,书上是这么写的,但是能释放同步函数的锁定吗?没做过试验,不过看楼主的情况好像是不能啊
      

  5.   

    to  netstarry(星光):
    应该不是死锁。因为它在大多时候都运行正常,而且他们线程之间并没有什么共享资源,不会因为某个线程在等待资源而发生死锁。
    to fastmask(我心烦) ( ):
    在其他线程里,有做判断TestThread是否是在dosomething(在使用这个线程前,TestThread.setBusy();
    调用requestResume的时候正在dosomething里
        public void run(){
            while(run){
                //1.do something
                ...
                //2.suspended
                requestSuspended();
            }
            setIdle();
        }
        public void setBusy(){}
      

  6.   

    没有死锁,关键你是什么时候调用requestResume的
      

  7.   

    应该可以运行吧,不是死锁.这个线程处于wait状态,然后在其它线程中调用此线程对象的requestResume方法,我觉得应该可以唤醒
      

  8.   

    不知这样可不可以:class TestThread extends Thread{
        private Object obj = new Object();
        public TestThread(){
        }
        public void run(){
            while(run){
                //1.do something
                ...
                //2.suspended
                requestSuspended();
            }
        }
        private void requestSuspended(){
            synchronized(obj)
              try{
                wait();
              }catch(Exception e){
             }
            }
        }    public void requestResume(){
            synchronized(obj) {
               notify();
            }
        }
    }
      

  9.   

    调用wait()的method必须是synchronized的,否则compile出IllegalMonitorStateExceptionclass TestThread extends Thread{
        private boolean runFlag = true;    public TestThread() {}    public void run(){
            while(!runFlag){
                //1.do something
                ...
                
                //2.suspended
                try {
                    wait();
                } catch (InterruptedException e){
                    System.err.println("Interrupted");
                }
            }
        }
        
        public void requestResume(){
            synchronized (this) {
                this.notify();
            }
        }
    }
      

  10.   

    notify()或者notifyAll()并不一定能唤醒休眠的线程,他们只是通知休眠中的线程可以有线程被唤醒了,但我们没法控制具体是哪个线程因该被立即唤醒执行.这跟系统线程调度算法有直接关系.