- 多线程的Wait返回它等待的下方。 Java Code
package org.vocano.java.tst;
class ThreadDemo {
public static void main( String[] args) {
Buffer buf = new Buffer();
new Producer(buf).start();
new Consumer(buf).start();
new Consumer(buf).start();
}
}
class Producer extends Thread {
private Buffer buf;
public Producer(Buffer buf) {
this.buf = buf;
}
public void run() {
boolean odd = false;
while(true) {
synchronized(buf) {
System.out.println( "Producer get lock!");
if(buf.bFull) {
System.out.println( "Producer wait!!!");
try{buf.wait();} catch(Exception e) {}
System.out.println( "Producer wait return return return !!!!!!! ");
}
if(odd) {
buf.name= "jack";
try{Thread.sleep( 100);} catch(Exception e) {}
buf.sex= "female";
} else {
buf.name= "lucy";
try{Thread.sleep( 100);} catch(Exception e) {}
buf.sex= "male";
}
buf.bFull = true;
buf.notify();
System.out.println( "Producer release lock!");
}
odd = !odd;
}
}
}
class Consumer extends Thread {
private Buffer buf;
public Consumer(Buffer buf) {
this.buf = buf;
}
public void run() {
while(true) {
synchronized(buf) {
System.out.println( "Consumer get lock!");
if(!buf.bFull) {
System.out.println( "Consumer wait!!!");
try{buf.wait();} catch(Exception e) {}
System.out.println( "Consumer wait return return return !!!!!!! ");
}
try{Thread.sleep( 500);} catch(Exception e) {}
System.out.println(buf.name + " : " + buf.sex);
buf.bFull = false;
buf.notify();
System.out.println( "Consumer release lock!");
}
}
}
}
class Buffer {
boolean bFull = false;
String name = "Unkown";
String sex = "Unkown";
}
- 输出:可看出Wait的返回时另一个的wait或者release,不是自己getLock,说明notify放回wait的点。 Java Code
Producer get lock!
Producer release lock!
Consumer get lock!
lucy : male
Consumer release lock!
Consumer get lock!
Consumer wait!!!
Producer get lock!
Producer release lock!
Producer get lock!
Producer wait!!!
Consumer wait return return return !!!!!!!
jack : female
Consumer release lock!
Producer wait return return return !!!!!!!
Producer release lock!
Producer get lock!
Producer wait!!!
Consumer get lock!