一般是wait(),notify()控制多线程吧,如一个线程调用wait()就会它挂起到线程池中等待,直到notify()它.如果是wait(long time)个人觉得在没到期的时候也可以被唤醒,而到期没有被唤醒应该回到running状态.其实你可以写个小程序测试一下.yield()是保证当前运行的线程放弃CPU的使用权,而进入ready状态(某一时刻运行的线程且只有一个)
如果要说一定,也只能说一定使当前正在运行的线程离开running状态,yield()是静态的.

解决方案 »

  1.   

    javadoc里面是这样描述的:
    Parameters:
    timeout - the maximum time to wait in milliseconds.
    这个时间是这个线程等待的最长时间,这个时间到了之后如果没有被notify那这个线程就会自动进入可执行的线程队列当中去。而在这个时间之内执行notify()就会被立刻唤醒!yield()当然能保证线程离开运行状态。而且本身线程还是留在可执行的线程队列里面
      

  2.   

    我现在有了新的理解:yield()肯定能保证当前线程离开运行状态到可执行状态,但是至于下一个被调入运行状态的线程还是有可能是刚刚调用了yield的那个线程(这是不是还要和优先级有关,正在运行的线程的优先级肯定优于或者等于可运行状态的线程的优先级).现在还有点疑惑就是:yield将当前线程调入到可运行状态后有没有降低线程的运行优先级?再说说wait(),javadoc里面对他的描述有一句:
    this method behaves exactly as if it simply performs the call wait(0)
    按照楼上的理解,调用wait最多只等0 milliseconds,然后就到可执行队列了,那么notify也就没有什么用了.
    疑惑中!
      

  3.   

    yield 使当前执行线程暂停,不会降低线程的运行优先级
      

  4.   

    wait(long timeout)
    等待notify或者超时,有一个条件满足就可能恢复到运行态。
    只是说有可能。yield是主动放弃执行,但是有可能调用了yield后该线程还是继续执行。
    这里也是有可能。
      

  5.   

    wait()是一直等!没有超时时间
      

  6.   

    谈一下鄙人个人的看法
    wait():等待这个对象的同步锁,要等待这个同步锁,你必须先获得这个同步锁,调用该方法后
           马上就放弃了这个同步锁,而且只有等别人来notify它,否则这个现场阻塞。
    wait(long ms):和上面的一样,不过有一个超时时间。假设调用了wait的现程被唤醒(调用了notify,notifyAll或者超时都可以)
    该现程就去竞争这个同步锁,如果失败了,继续等。因为可能有很多线程在等。yield():主动放弃执行,然后和其他线程竞争CPU,很可能又回到运行态,就像打球的时候把球
             抛出去和大家一块抢,结果又抢回来了。
      

  7.   

    treeroot(根根),老兄说得透彻,佩服!
      

  8.   

    看了treeroot(根根) 老兄的讲解,终于明白了,非常感谢!!
      

  9.   

    树根说得挺好,看看wait的java doc:
    public final void wait()
                    throws InterruptedException
    ...
    The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.步骤应该是这样的,调用wait的条件是必须获得锁,调用wait后就放弃了锁,当其他线程调用这个对象的notify方法时,这个线程被唤醒,但是还没有进入runnable状态,仍然block,因为他要重新获得对象的锁,否则一直等着。