synchronized (this) { completeTreadNo++;
if (completeTreadNo >= 3) {

notifyAll();
completeTreadNo = 0;

} else {

wait();

}这是我程序的片段,写在run()方法内,我同时起动了3个线程,但是当某个线程运行到notifyAll()是却没法唤醒wait的另外两个线程。
到底是怎么回事呢?

解决方案 »

  1.   

    你想想synchronized 是用来互斥访问的
    第一个线程进去后就一直等待
    别的线程进来
    而成为一个死锁
      

  2.   

    不会死锁的,wait以后就释放锁了,这个程序不存在死锁问题。
      

  3.   

    更正一下,会死锁,只是不会一开始死锁,因为无法notify其他线程,所以,到了第二轮的时候会出现死锁。这句话是循环执行的,执行到第四次的时候会死锁。
      

  4.   

    三个线程不要new3个对象,
    要有同一个实现了Runnable接口的对象产生Thread
    这样你写的程序才可以
      

  5.   

    不同的线程,可以不用new对象的方式吗?
      

  6.   


    synchronized (this) {                        completeTreadNo++;
                            if (completeTreadNo >= 3) {
                                
                                notifyAll();
                                completeTreadNo = 0;//这里你有将这个变量置为零,就有可能使得所有的线程 
                                                                   // 都不会被唤醒
                                
                            } else {
                                
                                wait();
                                
                            }
      

  7.   

    你是不是new了三个thread对象,这个时候锁住的是不同的对象,不是同一个
      

  8.   


    public class Test {
    public static void main (String[] args) {
    Runnable runnable=new myThread();
    Thread objThread1=new Thread(runnable);
    Thread objThread2=new Thread(runnable);
    Thread objThread3=new Thread(runnable);
    objThread1.start();
    objThread2.start();
    objThread3.start();
    }
    }
    class myThread implements Runnable{
    public static int completeTreadNo;
    public void run(){
    synchronized (this) {

            completeTreadNo++;
            if (completeTreadNo >= 3) {
                
                notifyAll();
                System.out.println("ok quit");
                completeTreadNo = 0;
                
            } else {
                try{
                 wait();
                 System.out.println("ok quit");
                
                }catch(Exception e){
                
                }
            }
    }
    }
    }
      

  9.   

    1. notifyAll只能用来唤醒一个线程,而不会唤醒所有线程
    2. 如你本意, 这段代码必须写到一个Runnable中,而分别使用new Thread(runable)来创建多个线程才会对同一个对象同步
       (即竞争地是同一个资源).此处假设你的completeTreadNo是个非static变量
    3. 执行过程应该是这样的:
       a. 线程1: no=1, wait()
       b. 线程2: no=2, wait()
       c. 线程3: no=3, notifyAll()[这里只唤醒一个线程,还有一个仍在wait], no=0
    4. 请验证
      

  10.   

    Quote=引用 17 楼 Iangao 的回复:]
    1. notifyAll只能用来唤醒一个线程,而不会唤醒所有线程 
    唤醒所有的(在该对象上边等待的),你的理解不对
    2. 如你本意, 这段代码必须写到一个Runnable中,而分别使用new Thread(runable)来创建多个线程才会对同一个对象同步 
      (即竞争地是同一个资源).此处假设你的completeTreadNo是个非static变量 一样的[
    3. 执行过程应该是这样的: 
      a. 线程1: no=1, wait() 
      b. 线程2: no=2, wait() 
      c. 线程3: no=3, notifyAll()[这里只唤醒一个线程,还有一个仍在wait], no=0 
    没有执行else语句,根本没有wait()啊
    4. 请验证
    [/Quote]