class Mailbox { public boolean request; public String message; public static int i = 1; public synchronized void store(String mess) { while (request==true) { try { System.out.println("i am waiting in store"); wait(); } catch (InterruptedException e) {} } message=mess; request=true; notify(); } public synchronized String retrieve() { while (request==false) { try { System.out.println("i am waiting in retrieve"); notify(); wait(); } catch (InterruptedException e) {} } request=false; return message; } }class MyThread extends Thread { Mailbox box; MyThread(Mailbox box){this.box=box;} public void run() { int i; // while(true) { for (i=0;i<10;i++) box.store("OK"+i); // } } }class MyThread1 extends Thread { Mailbox box1; MyThread1(Mailbox box1){this.box1=box1;} public void run() { while(true) { System.out.println(box1.retrieve()); } } } class Test { public static void main(String[] args) { Mailbox myMailbox=new Mailbox(); myMailbox.request = false; new MyThread(myMailbox).start(); new MyThread1(myMailbox).start(); }
//Test类 少了一个 } class Test { public static void main(String[] args) { Mailbox myMailbox=new Mailbox(); myMailbox.request = false; new MyThread(myMailbox).start(); new MyThread1(myMailbox).start(); } }
public boolean request;
public String message;
public static int i = 1; public synchronized void store(String mess) {
while (request==true) {
try {
System.out.println("i am waiting in store");
wait();
} catch (InterruptedException e) {}
}
message=mess;
request=true;
notify();
} public synchronized String retrieve() {
while (request==false) {
try {
System.out.println("i am waiting in retrieve");
notify();
wait();
} catch (InterruptedException e) {}
}
request=false;
return message;
}
}class MyThread extends Thread {
Mailbox box;
MyThread(Mailbox box){this.box=box;}
public void run() {
int i;
// while(true) {
for (i=0;i<10;i++)
box.store("OK"+i);
// }
}
}class MyThread1 extends Thread {
Mailbox box1;
MyThread1(Mailbox box1){this.box1=box1;} public void run() {
while(true) {
System.out.println(box1.retrieve());
}
}
}
class Test {
public static void main(String[] args) {
Mailbox myMailbox=new Mailbox();
myMailbox.request = false; new MyThread(myMailbox).start();
new MyThread1(myMailbox).start();
}
public static void main(String[] args) {
Mailbox myMailbox=new Mailbox();
myMailbox.request = false; new MyThread(myMailbox).start();
new MyThread1(myMailbox).start();
}
}
最好在一些关键地方 println 些消息, 方便你观看执行流程.存邮件线程, 应该是存完后通知取邮件线程
取邮件线程是当没有邮件时再通知存邮件线程.这是同步逻辑的关键地方