我的Java程序线程被阻塞,我需要帮助找出原因

时间:2018-09-13 20:35:03

标签: java multithreading

我正在学习如何自己使用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();
        }
    }
}
我也有两个类:Producer类和Consumer类,它们每个都实现Runnable接口并覆盖run()方法。

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”,而没有其他内容。我认为可能有一个街区,但我不知道在哪里。请帮我解决这个问题!

1 个答案:

答案 0 :(得分:1)

您的使用者只调用一次pop(),因此您只会得到一个结果。如果进行线程转储,您应该能够看到生产者正在运行而使用者没有在运行。

我建议您在传递50条消息时调用pop()50次。

一种更好的方法是传递一种特殊的“毒药”,让消费者知道没有更多的数据。

您应该能够编写此代码而无需调用sleep