我正在学习如何自己使用wait()和notify()方法,我试图制作一个简单的程序,该程序交替输出“杰克男”和“简女” 50次。 我有包含两个线程将要使用的方法的资源类。 看起来像这样:
public class ShareResource {
String name;
String gender;
boolean isEmpty = true;
synchronized public void push(String name, String gender) {
try {
while (isEmpty==false) {
this.wait();
}
this.name = name;
Thread.sleep(10);
this.gender = gender;
isEmpty = false;
this.notify();
} catch (Exception e) {
e.printStackTrace();
}
}
synchronized public void pop() {
try {
while (isEmpty) {
this.wait();
}
Thread.sleep(10);
System.out.println(this.name + " "+this.gender);
isEmpty = true;
this.notify();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Producer implements Runnable{
private ShareResource resource=null;
public Producer(ShareResource resource){
this.resource=resource;
}
@Override
public void run() {
for (int i=0;i<50;i++){
if (i%2==0){
resource.push("Jack","male");
}else{
resource.push("Jane","female");
}
}
}
}
public class Consumer implements Runnable {
private ShareResource resource=null;
public Consumer(ShareResource resource){
this.resource=resource;
}
@Override
public void run() {
resource.pop();
}
}
public class Driver {
public static void main(String[] args){
ShareResource resource=new ShareResource();
new Thread(new Producer(resource)).start();
new Thread(new Consumer(resource)).start();
}
}
当我运行该程序时,它仅打印一次“ Jack Male”,而没有其他内容。我认为可能有一个街区,但我不知道在哪里。请帮我解决这个问题!
答案 0 :(得分:1)
您的使用者只调用一次pop(),因此您只会得到一个结果。如果进行线程转储,您应该能够看到生产者正在运行而使用者没有在运行。
我建议您在传递50条消息时调用pop()50次。
一种更好的方法是传递一种特殊的“毒药”,让消费者知道没有更多的数据。
您应该能够编写此代码而无需调用sleep