关于多线程的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自己回忆就这么一群回复了,偶先睡觉了~明天老班查课,不得不去
------解决方案--------------------