-2

以下のソースコードは、製品/消費者のパターンを実装するために使用されていますが、うまく機能せず、解決方法がわかりません。

クラス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の出力は次のとおりです。

追加-01340777963967

追加-11340777963968

追加-21340777963968

追加-31340777963968

追加-41340777963968

追加-51340777963968

追加-61340777963968

追加-71340777963968

追加-81340777963968

追加-91340777963968

私の意図は、リストに保存されて消費者によって消費されたProductor製品の10個の要素、次にProductor製品の要素、Consumerが再び消費することです...フィードバックをいただければ幸いです。

4

1 に答える 1

0

リストにない別のスレッドで待機/通知します。したがって、スレッドは共有モニターではなく、独自のモニターで実行されます。「javawaitnotify」を検索して読み続けてください。

于 2012-06-27T06:55:11.120 に答える