关于消费者/产品模式

时间:2012-06-27 06:13:22

标签: java

以下源代码用于实现产品/消费者模式,但它们不能很好地工作,我不知道如何解决它。

第1课:制作人

package test;

import java.util.ArrayList;
import java.util.List;

public class Productor extends Thread {

private List list = null;

public Productor(ArrayList list) {
    this.list = list;
}

public synchronized void product() throws InterruptedException {
    for (int e = 0; e < 10; e++) {
        System.out.println("Add-" + e + "  " + System.currentTimeMillis());
        list.add(e);

        if (list.size() >= 10) {
            wait();
        } else {
            notifyAll();
        }
    }
}

public void run() {
    try {
        while(true){
            product();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

第2课:消费者     包装测试;

import java.util.ArrayList;
import java.util.List;

public class Consumer extends Thread {

private List list = null;

public Consumer(ArrayList list) {
    this.list = list;
}

public synchronized void consume() throws InterruptedException {
    if (list.size() <= 0) {
        wait();
    } else {
        notifyAll();
    }

    for (int e = 0; e < list.size(); e++) {
        System.out.println("Remove-" + e + "  "
                + System.currentTimeMillis());
        list.remove(e);
    }
}

public void run() {
    try {
        while(true){
            consume();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

第3课:测试产品/消费者     包装测试;

import java.util.ArrayList;

public class TestCP {
public static void main(String args[]) throws InterruptedException {
    ArrayList product = new ArrayList();
    Productor pt = new Productor(product);
    Consumer ct = new Consumer(product);
    pt.start();
    ct.start();
}
}

TestCP的输出是:

Add-0 1340777963967

Add-1 1340777963968

Add-2 1340777963968

Add-3 1340777963968

Add-4 1340777963968

Add-5 1340777963968

Add-6 1340777963968

Add-7 1340777963968

Add-8 1340777963968

Add-9 1340777963968

我的意图是Productor产品10个元素存储在一个列表中并由Consumer消费,然后再次生成Productor产品元素,Consumer再次消耗... 任何反馈将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:0)

您在不在列表上的其他线程上等待/通知。因此,线程在自己的监视器上运行,而不是在共享监视器上运行。搜索“java wait notify”并继续阅读。