使用Java中的多线程的生产者/消费者

时间:2012-02-22 18:50:13

标签: java multithreading

我是否需要添加以下代码的任何包才能成功执行?我在代码中遇到错误,我无法修复,特别是在使用synchronized关键字时。谁能指出我做错了什么?谢谢。

数据对象:

class Q
{
    int n;
    boolean valueset=false;

    synchronized int get()
    {
        if(!valueset)

            try
            {
                wait();
            }
            catch(InterruptedException e)
            {
                System.out.println("Interrupted Exception Caught.");
            }


            System.out.println("Got:"+n);
            valueset=false;
            notify();
            return n;

    }

    synchronized void put(int n)
    {
        if(valueset)

            try
            {
                wait();
            }
            catch(InterruptedException e)
            {
                System.out.println("Interrupted Exception Caught.");
            }

            this.n=n;
            valueset=true;
            System.out.println("Put:"+n);
            notify();

    }
}

制片:

class Producer implements Runnable
{
    Q q;
    Producer(Q q)
    {
        this.q=q;
        new Thread(this,"Producer").start();
    }

        public void run()
        {
            int i=0;
            while(true)
            {
                q.put(i++);
            }
        }

}

消费者:

class Consumer implements Runnable
{
    Q q;
    Consumer(Q q)
    {
        this.q=q;
        new Thread(this,"Consumer").start();
    }   

        public void run()
        {
            while(true)
            {
                q.get();
            }
        }

}

额外课程:

class PCfixed 
{
    public static void main(String[] args) 
    {
        Q q=new Q();
        new Producer(q);
        new Consumer(q);

        System.out.println("Press Control-C to stop.");
    }
}

2 个答案:

答案 0 :(得分:0)

如果没有更多信息,可能无法正确回答,但以下肯定是一个问题[虽然可能不是您遇到的]:
你没有在循环中调用wait()javedocs清楚地表明

  

......应用程序必须通过测试条件来防范它   应该导致线程被唤醒,并继续等待   如果条件不满意。换句话说,应该总是等待   发生在循环......

可在此thread

中找到更多信息

答案 1 :(得分:0)

ProducerConsumer中,您正尝试在构造函数中定义方法public void run() 。花括号在错误的地方。