Warten auf Bedingung in Java

Möchte ich einen thread, stellt Werte in eine queue, wenn er leer wird, und warten Sie für diesen Zustand, während man es nicht ist. Hier ist der code, den ich versucht habe zu verwenden, aber es druckt

Adding new
Taking Value 1
Taking Value 2
Taking Value 3
Taking Value 4

Also es funktioniert nur ein mal. Was ist das problem?

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;


public class SO {
    public String test;
    public String[] list = new String[] {test};

    public static void main(String[] args) {
        new SO();
    }

    public SO() {
        go();
    }

    BlockingQueue<String> qq = new LinkedBlockingQueue<String>();

    class Producer implements Runnable {
        public void run() {
            try {
                while (true) {
                    synchronized (this) {
                        while (qq.size() > 0)
                            wait();

                        System.out.println("Adding new");
                        qq.put("Value 1");
                        qq.put("Value 2");
                        qq.put("Value 3");
                        qq.put("Value 4");
                    }
                }
            } catch (InterruptedException ex) {}
        }
    }

    class Consumer implements Runnable {
        public void run() {
            try {
                while(true) {
                    System.out.println("Taking " + qq.take()+". "+String.valueOf(qq.size())+" left");
                    Thread.sleep(1000);
                }
            } catch (InterruptedException ex) {}
        }
    }

    public void go() {
        Producer p = new Producer();
        Consumer c = new Consumer();

        new Thread(p).start();
        new Thread(c).start();
    }
}
Anstelle der Verwendung von wait/notify-und damit verbundenen Größe die überprüfung der Logik, der Sie dies tun könnte (je nachdem, ob oder nicht, Sie wollen immer mehr als ein Objekt in der Warteschlange für den Verbrauch) mit LinkedBlockingQueue.put auf eine Warteschlange von Kapazität 1. Die put Methode in javadocs sagen: "Fügt das angegebene element am Schwanz der Warteschlange zu warten, wenn notwendig, für Speicherplatz verfügbar."

InformationsquelleAutor Fluffy | 2010-02-28

Schreibe einen Kommentar