producteur - consommateur en Java multithreading

Je veux écrire le programme en utilisant le multithreading attendre et de les informer des méthodes en Java.

Ce programme a une pile (max-longueur = 5). Producteur de générer des nombre pour toujours et à le mettre dans la pile, et les consommateurs de choisir parmi la pile.

Lorsque la pile est pleine producteur doit attendre et quand la pile est vide, les consommateurs doivent attendre.

Le problème est qu'il s'exécute une seule fois, je veux dire une fois qu'il produit 5 nombre il s'arrête, mais j'ai mis exécuter des méthodes dans while(true) bloc à courir non-stop pouvoir mais il ne le fait pas.

Voici ce que j'ai essayé jusqu'à présent.

Producteur de classe:

package trail;
import java.util.Random;
import java.util.Stack;

public class Thread1 implements Runnable {
    int result;
    Random rand = new Random();
    Stack<Integer> A = new Stack<>();

    public Thread1(Stack<Integer> A) {
        this.A = A;
    }

    public synchronized void produce()
    {
        while (A.size() >= 5) {
            System.out.println("List is Full");
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        result = rand.nextInt(10);

        System.out.println(result + " produced ");
        A.push(result);
        System.out.println(A);

        this.notify();
    }

    @Override
    public void run() {
        System.out.println("Producer get started");

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        while (true) {
            produce();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Et le consommateur:

package trail;

import java.util.Stack;

public class Thread2 implements Runnable {
    Stack<Integer> A = new Stack<>();

    public Thread2(Stack<Integer> A) {
        this.A = A;
    }

    public synchronized void consume() {
        while (A.isEmpty()) {
            System.err.println("List is empty" + A + A.size());
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.err.println(A.pop() + " Consumed " + A);
        this.notify();
    }

    @Override
    public void run() {
        System.out.println("New consumer get started");
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        while (true) {
            consume();
        }
    }
}

et ici est la méthode principale:

public static void main(String[] args) {

        Stack<Integer> stack = new Stack<>();

        Thread1 thread1 = new Thread1(stack);//p
        Thread2 thread2 = new Thread2(stack);//c
        Thread A = new Thread(thread1);
        Thread B = new Thread(thread2);
        Thread C = new Thread(thread2);
        A.start();

        B.start();
        C.start();     
    }
Quels objets sont synchronisation sur le producteur? Quels objets sont synchronisation sur le consommateur?
veuillez remplir le code et supprimer les lignes vides et ceux avec des commentaires inutiles
prodeuce méthode dans Thread1 de classe et de consommer de la méthode dans Thread2 classe sont synchornized
Regardez: stackoverflow.com/documentation/java/121/...

OriginalL'auteur Saeed Mirzaee | 2013-08-13