Thread Producer - Consumer

Adriano10

Bekanntes Mitglied
Java:
public class ProducerAndConsumer<T> {
    private boolean available = false;
    private Map<T, T> map;
    private T i;
    Semaphore mutex ;
    Semaphore notEmpty;

    public ProducerAndConsumer(int n, Semaphore mutex, Semaphore notEmpty) {
        map = new HashMap<>(n);
        this.mutex = mutex;
        this.notEmpty = notEmpty;
    }

    public void add(T key, T value) throws InterruptedException {
        try {
            mutex.acquire();
            map.put(key, value);
        } finally {
            notEmpty.release();
        }
    }

    public T remove(T key) throws InterruptedException {
        try {
            notEmpty.acquire();
            T elem = map.remove(key);
            if (elem == null) {
                System.out.println(key + ": " + elem + " is Null");
                throw new NullPointerException();
            } else {
                return elem;
            }
        }finally {
            mutex.release();
        }
    }

    public T getValue(T key) throws InterruptedException {
        T value = map.get(key);
        return value;
    }

}

class Producer extends Thread {
    static Random generator = new Random();
    private int number;
    ProducerAndConsumer producerAndConsumer;
    Random random;
    Semaphore mutex = new Semaphore(1);
    Semaphore notEmpty = new Semaphore(0);

    public Producer(int number, ProducerAndConsumer producerAndConsumer) {
        this.producerAndConsumer = producerAndConsumer;
        this.number = number;
        random = new Random();
    }

    @Override
    public void run() {
        
        for (int i = 0; i < 3; i++) {
            try {
                Thread.currentThread().sleep(Math.abs(generator.nextInt() % 1000));
            } catch (InterruptedException e) {
            }
            ;
            try {
                producerAndConsumer.add(i, random.nextInt());
                System.out.println("Producer: " + number + ": " + i + " produziert!");
            } catch (InterruptedException exception) {
                exception.printStackTrace();
            }
        }
    }
}

class Consume extends Thread {
    static Random generator = new Random();
    private int number;
    ProducerAndConsumer producerAndConsumer;
    Random random;
    Semaphore mutex = new Semaphore(1);
    Semaphore notEmpty = new Semaphore(0);
    public Consume(int number, ProducerAndConsumer producerAndConsumer) {
        this.producerAndConsumer = producerAndConsumer;
        this.number = number;
        random = new Random();
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            try {
                Thread.currentThread().sleep(Math.abs(generator.nextInt() % 1000));
            } catch (InterruptedException e) {
            }
            ;
            try {
                producerAndConsumer.remove(i);
                System.out.println("Producer: " + number + ": " + i + " konzumiert!");
            } catch (InterruptedException exception) {
                exception.printStackTrace();
            }
        }
    }
}

class Main2 {

    public static void main(String[] args) throws InterruptedException {
        Semaphore mutex = new Semaphore(1);
        Semaphore notEmpty = new Semaphore(0);
        ProducerAndConsumer<Integer> producerAndConsumer = new ProducerAndConsumer<>(10, mutex, notEmpty);
        Random random = new Random(10);

        for (int i = 0; i < 3; i++) {
            Producer producer = new Producer(i, producerAndConsumer);
            producer.start();
        }

        for (int i = 0; i < 3; i++) {
            Consume consume = new Consume(i, producerAndConsumer);
            consume.start();
        }
    }
}

Wenn ich ein Producer und ein Consumer habe, dann funktioniert aber wenn ich 3 Producer und 3 Consumer habe, wie in der Code, dann funktioniert nicht mehr.

Vielen Dank im Voraus
 

Adriano10

Bekanntes Mitglied
Java:
package pruducerConsumer;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.Semaphore;

public class ProducerAndConsumer<T> {
    private boolean available = false;
    private Map<T, T> map;
    private T i;
    Semaphore mutex;
    Semaphore notEmpty;

    public ProducerAndConsumer(int n, Semaphore mutex, Semaphore notEmpty) {
        map = new HashMap<>(n);
        this.mutex = mutex;
        this.notEmpty = notEmpty;
    }

    public void add(T key, T value) throws InterruptedException {
        try {
            mutex.acquire();
            map.put(key, value);
        } finally {
            notEmpty.release();
        }
    }

    public T remove(T key) throws InterruptedException {
        try {
            notEmpty.acquire();
            T elem = map.remove(key);
            if (elem == null) {
                System.out.println(key + ": " + elem + " is Null");
            } else {
                return elem;
            }
        } finally {
            mutex.release();
        }
        return null;
    }

    public T getValue(T key) throws InterruptedException {
        T value = map.get(key);
        return value;
    }

}

class Producer extends Thread {
    static Random generator = new Random();
    private int number;
    private ProducerAndConsumer producerAndConsumer;
    private Random random;
    private Semaphore mutex = new Semaphore(3);

    public Producer(int number, ProducerAndConsumer producerAndConsumer) {
        this.producerAndConsumer = producerAndConsumer;
        this.number = number;
        random = new Random();
        this.mutex = mutex;
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            try {
                Thread.currentThread().sleep(Math.abs(generator.nextInt() % 1000));
            } catch (InterruptedException e) {
            }
            ;
            try {
                producerAndConsumer.add(i, random.nextInt());
                System.out.println("Producer: " + number + ": " + i + " produziert!");
            } catch (InterruptedException exception) {
                exception.printStackTrace();
            }
        }
    }
}

class Consume extends Thread {
    static Random generator = new Random();
    private int number;
    private ProducerAndConsumer producerAndConsumer;
    private Random random;
    private Semaphore notEmpty = new Semaphore(3);

    public Consume(int number, ProducerAndConsumer producerAndConsumer) {
        this.producerAndConsumer = producerAndConsumer;
        this.number = number;
        random = new Random();
        this.notEmpty = notEmpty;
    }

    @Override
    public void run() {

        for (int i = 0; i < 3; i++) {
            try {
                Thread.currentThread().sleep(Math.abs(generator.nextInt() % 1000));
            } catch (InterruptedException e) {
            }
            try {
                producerAndConsumer.remove(i);
                System.out.println("Consumer: " + number + ": " + i + " konzumiert!");
            } catch (InterruptedException exception) {
                exception.printStackTrace();
            }
        }
    }
}

class Main2 {

    public static void main(String[] args) throws InterruptedException {
        Semaphore mutex = new Semaphore(1);
        Semaphore notEmpty = new Semaphore(0);
        Semaphore mutex1 = new Semaphore(3);
        ProducerAndConsumer<Integer> producerAndConsumer = new ProducerAndConsumer<>(10, mutex, notEmpty);

        for (int i = 0; i < 3; i++) {
            try {
                mutex1.acquire();
                Producer producer = new Producer(i, producerAndConsumer);
                producer.start();
                Consume consume = new Consume(i, producerAndConsumer);
                consume.start();
                consume.join();
                producer.join();
            } finally {
                mutex1.release();
            }
        }

    }
}

Ich habe das so gelöst. Zwar das funktioniert, aber weiß leider nicht, ob ich alles richtig gemacht habe
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
S Methoden Multi-Thread und Methoden Objects. Java Basics - Anfänger-Themen 1
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Thread-Frage Java Basics - Anfänger-Themen 2
E Was ist ein idle-thread? Java Basics - Anfänger-Themen 1
D Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 8
J Threads Prozess in Thread auslagern Java Basics - Anfänger-Themen 2
G Thread mehrmals starten und schliessen Java Basics - Anfänger-Themen 6
F Thread Koordination (Vorteile/Nachteile) Java Basics - Anfänger-Themen 0
O Thread aus dem Thread stoppen Java Basics - Anfänger-Themen 6
O Swingworker/Thread Java Basics - Anfänger-Themen 3
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
S musik in eigenem thread Java Basics - Anfänger-Themen 2
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
IngoF GUI mit Thread Daten austauschen. Java Basics - Anfänger-Themen 6
L Compiler-Fehler Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 2
F Exception in thread main java.lang.StackOverflowError Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben