日期:2014-05-20  浏览次数:20769 次

关于多线程的wait和notify产生的问题。
Java code
 class Maintest {
    public static void main(String args[]) throws Exception {
        ThreadDemo thr = new ThreadDemo();
        thr.start();
        for (int i = 1; i < 1000; i++) {
            synchronized (Maintest.class) {  //Maintest.class是什么意思,非常不明白
                System.out.println("main: " + i);
                Maintest.class.notify();  //这个与下边怎么联系?
                Maintest.class.wait();
            }
        }

    }
}

class ThreadDemo extends Thread {
    public void run() {
        for (int i = 1; i < 1000; i++) {
            try {
                synchronized (Maintest.class) {                      System.out.println(this.getName() + ":" + i);
                    Maintest.class.notify();
                    Maintest.class.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}



------解决方案--------------------
Maintest.class就是一个对象,用这个对象作为锁,只有获取到这个对象以后才能访问synchronized块中的内容。
wait的时候会释放该对象锁,通过这个对象wait的线程在该对象调用notify的时候会被唤醒

不知道说明白了没有
------解决方案--------------------
LZ 我在看21.4终止任务 21.5就是线程协作了 看完跟你讨论哇

你看得比我快 :(
------解决方案--------------------
我看完了 是这样的

Maintest.class 这种东西叫 类字面常量
他是用来生成对class对象的引用 说白了Maintest.class在这里就是一个锁 就跟用String "aaa" 或者this一样
 
synchronized(o){} o.notify(); o.wait(); 这个3个东西用同一个锁

所以就需要 

Java code

synchronized (Maintest.class) {  
                System.out.println("main: " + i);
                Maintest.class.notify();  
              }

------解决方案--------------------
这个例子比较有才。
------解决方案--------------------
探讨
这个例子比较有才。

------解决方案--------------------
探讨
引用:
这个例子比较有才。

承蒙夸奖,这例子是鄙人之手。当初是为了完成他的愿望。

------解决方案--------------------
Maintest.class 这个是‘锁’是在锁上面做同步的。

线程判断是否可以进入代码块的时候先看看锁是否开的,就像房门是否是开的。房门同一时间只能进入一个人
进屋后,有人wait就是关门,睡觉
有人notify就是开门

先开门在睡觉
lock.notify();
lock.wait();
关门的时机是wait这行代码执行结束
开门的时机是synchronized {}结束,或者执行wait
 
------解决方案--------------------
探讨
引用:
这个例子比较有才。

承蒙夸奖,这例子是鄙人之手。当初是为了完成他的愿望。

------解决方案--------------------
忘了讲出门
代码块结束了就是人从屋子里面出来了
只有一种情况屋子里面会有两个人
就是第一个人睡觉了,第二个人才可以进去,刚才讲了,wait也是可以开门的

不同的锁可以理解为同一个屋子的 镜像,他们彼此是隔离的
就是锁同一个代码块可以是不同的锁,虽然是同一个代码块,但是一定要把不同的锁当成不通的屋子

为什么锁会不同,这个很简单了
synchronized (变量)
是变量当然就会不同了,

不知道例子举得好不好,明白了吗?
------解决方案--------------------
恩,是三楼的说法~
那个Maintest.class可以随便更换为一对象,同一对象只有一把对应的锁
利用该对象锁来进行 wait与notify,
其实一般的问题比这要复杂,通常有多个不同的线程挂在一把锁上~
不说了~感觉一说就象打开自己记忆一样,停不下来`~

------解决方案--------------------
汗,刚在写test自己回忆就这么一群回复了,偶先睡觉了~明天老班查课,不得不去
------解决方案--------------------
探讨
刚在写test自己回忆