Thread will nicht starten

Bud01

Mitglied
Guten Abend liebes Forum,
also ich habe unten folgende Aufgabe gegeben und habe das Problem, dass der Thread der Verkaufstelle nicht startet. Wäre nett von, wenn jemand einen Tipp hätte.

Eine Schuhfabrik hat mehrere Verkaufsstellen und Produktionsstätten.
Hierbei gibt es zwei Arten von Produktionsstätten:
(1) eine, die nur linke Schuhe und (2) eine, die nur rechte Schuhe anfertigt.
Die produzierten Schuhe werden also in zwei Lager (Lager-L, Lager-R) gesammelt, wobei
jeweils maximal 10 Schuhe gelagert werden können. Die Verkaufstellen ordern zunächst
immer einen linken und dann einen rechten Schuh.
Java:
package viertensErstens;

public class ProduzentLinks extends Thread {

	private LagerLinks links = new LagerLinks();

	public ProduzentLinks() {

	}

	public void run() {
		while (true) {
			links.lagerBefuellenLinks();

		}
	}
}
Java:
package viertensErstens;

public class ProduzentRechts extends Thread {
	private LagerRechts rechts = new LagerRechts();

	public ProduzentRechts() {

	}

	public void run() {
		while (true) {
			rechts.lagerBefuellenRechts();
		}
	}

}
Java:
package viertensErstens;

import java.util.concurrent.Semaphore;

public class Verkaufsstelle extends Thread {
	private LagerLinks links;
	private LagerRechts rechts;
	Semaphore s = new Semaphore(1);

	public Verkaufsstelle() {

	}

	public void run() {
		while (true) {
			try {
				s.acquire();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			links.lagerEntleerenLinks();
			rechts.lagerEntleerenRechts();
			System.out.println("Schuhpaar verkauft.");
			s.release();
		}

	}

	public static void main(String[] args) {
		Thread produzentLinks = new Thread(new ProduzentLinks());
		produzentLinks.start();
		Thread produzentRechts = new Thread(new ProduzentRechts());
		produzentRechts.start();
		Thread verkaufsstelle = new Thread(new Verkaufsstelle());
		verkaufsstelle.start();

	}
}
Java:
package viertensErstens;

public class LagerLinks {
	int lagerplatzLinks;

	public LagerLinks() {
		lagerplatzLinks = 10;

	}

	public void lagerBefuellenLinks() {

		if (lagerplatzLinks >= 0 && lagerplatzLinks <= 10) {
			lagerplatzLinks--;
			System.out.println("Linkes Lager befuellt: " + lagerplatzLinks);
		}

		else {
			System.out.println("Linkes Lager voll!");
		}

	}
	public void lagerEntleerenLinks(){
		if(lagerplatzLinks >= 0 && lagerplatzLinks <= 10 ){
			lagerplatzLinks++;
			System.out.println("Linkes Lager entleert: " +  lagerplatzLinks);
			
		}
	}
}
Java:
package viertensErstens;

public class LagerRechts {
	 int lagerplatzRechts;
	
	public LagerRechts(){
		lagerplatzRechts = 10;
	}
	public void lagerBefuellenRechts() {
		
		if (lagerplatzRechts > 0 && lagerplatzRechts <= 10){
			lagerplatzRechts--;
		System.out.println( "Rechtes Lager befuellt: " + lagerplatzRechts);}

		else {
			System.out.println("Rechtes Lager voll!");
		}
	
	}
	public void lagerEntleerenRechts(){
		if(lagerplatzRechts >= 0 && lagerplatzRechts <= 10 ){
			lagerplatzRechts++;
			System.out.println("Rechtes Lager entleert: " +  lagerplatzRechts);
			
		}
	}
}
 
G

Gast2

Gast
Java:
verkaufsstelle.start();
Du rufst start() auf, also startet der Thread auch. Woran machst du fest dass der nicht läuft? Hast du schonmal nen sysout reingesetzt?

Java:
public class Verkaufsstelle extends Thread {
...
Thread verkaufsstelle = new Thread(new Verkaufsstelle());
Du brauchst nicht zwei Threads. Es reicht wenn deine Klasse Runnable implementiert, oder du startest deine Threads so:
Java:
Thread verkaufsstelle = new Verkaufsstelle();
verkaufsstelle.start();
 

Michael...

Top Contributor
Der Code wirft schon mal grundsätzliche Fragen auf:
Was unterscheidet die Klasse ProduzentLinks von der Klasse ProduzentRechts?
Was unterscheidet die Klasse LagerLinks von der Klasse LagerRechts?
Antwort: nichts (mal abgesehen von den Klassen, Methoden und Variablennamen)
Warum als nicht eine Klasse Produzent und eine Klasse Lager und davon eine jeweils "rechte" und "linke" Instanz erzeugen.
Wozu die Semaphore? Macht hier gar keinen Sinn, da sie nur in einem Thread genutzt wird.
 
B

...ButAlive

Gast
Die Thread für die Verkaufsstelle startet schon, aber fliegt gleich am Anfang raus. Nimm mal einfach deine Ausgaben "Lager voll" raus dann siehst du auch wo. Kleiner Tipp, schau dir mal genau an welchen Wert die Lager in der Verkaufsstelle haben, bzw. wo du deren Wert setzt.
 

Bud01

Mitglied
@ Eike: OK, das habe ich geändert. Und ich mache es daran aus, dass ja eigentich irgendwann mal eine Ausgabe kommen sollte, dass ein Paar Schuhe verkauft wurden.
@Michael: Naja, die Aufgabe verlangt es so. Da kann ich nichts für.
@ButALive: Ich habe mal die "Lager voll"-syso's rausgenommen und habe gesehehn, dass der Lagerplatz immer weniger wird und dann negativ, was schließlich zur Exception führt...
 
B

...ButAlive

Gast
Echt das hast du beobachtet? Dann hast du aber einen anderen Code ausgeführt als den den du hier gepostet hast. In dem hier sind die Lager der Verkaufsstelle null was zwangsläufig zu einer NullpointerException führt.

Fang doch einfach mal damit an, dass du eine Marktlücke schließt und ein Schuhgeschäft für Einbeinige baust. Im Prinzip relativ einfach: Du hast einen Schuhfabrik die produziert Schuhe und lagert diese in einem Lager ein. Das kann sie nur solange machen bis das Lager voll ist. Wenn es voll ist, muss sie warten. Das Geschäft verkauft den Schuh aus dem selben Lager. Wenn das Lager leer ist muss das Geschäft warten bis neue da sind.

Der Schritt zu zwei paar Schuhen sollte dann nicht mehr so schwer sein. Das ganze ist auch als Erzeuger-Verbraucher-Problem bekannt.
 

Bud01

Mitglied
Echt das hast du beobachtet? Dann hast du aber einen anderen Code ausgeführt als den den du hier gepostet hast.
Doch, das ging bis -1 und lag aber daran, dass ein <= falsch gesetzt war


Kann ich mir ehrlich gesagt nur schwer vorstellen. Die rechts/links Klassen sind vollkommen identisch.
Die Verwendung von Semaphore ist aber - zumindest wie es hier passiert - vollkommen nutzlos.
Warum denkt hier eigentlich jeder, dass ich lüge?


Was ich aber durch den Tipp mit dem erstmal nur eine Sorte Shuhe produzieren und verkaufen herausgefunden habe, ist, dass in der run() der Klasse Verkaufsstelle bei links.lagerEntleerenLinks(); die NPE geworfen wird...
 

Michael...

Top Contributor
Warum denkt hier eigentlich jeder, dass ich lüge?
Weder habe ich das behauptet, noch denke ich das. Meine Vermutung war nur, dass die Aufgabenstellung fehlinterpretiert wurde.
Wenn man sich mal die beiden Produzentenklassen anschaut, stellt man fest erben von Thread (wobei sie m.M. stattdessen besser Runnable implementieren sollten), besitzen ein Lager und befüllen dieses innerhalb der run() ==> Macht es doch keinen Sinn für den Produzenten Links, Rechts, A, B, X, Y, Z jeweils eine eigene Klasse zu schreiben.
Genauso verhält es sich mit den zwei Lagerklassen. Ein Lager besitzt eine max Kapazität und kann befüllt und entleert werden. Einzig in der Ausgabe Ihres Namens unterscheiden sie sich - und das könnte man mit zusätzlichen einer Variable name abbilden.

Daher kann ich mir schwer vorstellen, dass in einer Aufgabenstellung die OOP vermitteln soll verlängt wird für zwei quasi gleiche Objekte jeweils eine separate Klasse zu schreiben.

Ansonsten kommt die NPE weil die Variablen nicht initialisiert wurden.
 

Bud01

Mitglied
Also hier nochmal die ungekürzte Aufgabe
Eine Schuhfabrik hat mehrere Verkaufsstellen und Produktionsst¨atten. Ihre Lagerverwaltung
soll auf ein EDV-System umgestellt werden. Hierbei gibt es zwei Arten von Produktionsst
¨atten: (1) eine, die nur linke Schuhe und (2) eine, die nur rechte Schuhe anfertigt.
Die produzierten Schuhe werden also in zwei Lager (Lager-L, Lager-R) gesammelt, wobei
jeweils maximal 1000 Schuhe gelagert werden k¨onnen. Die Verkaufstellen ordern zun¨achst
immer einen linken und dann einen rechten Schuh.
Vervollst¨andigen Sie das folgende Programm-Fragment mit Semaphoren, um Konflikte
zu vermeiden.
// Produktionsst¨atte Linker Schuh
void prod-linker-schuh() {
while (true) {
produziere(linker-schuh);
bringe-ins-Lager-L(linker-schuh);
}
}
// Produktionsst¨atte Rechter Schuh
void prod-rechter-schuh() {
while (true) {
produziere(rechter-schuh);
bringe-ins-Lager-R(rechter-schuh);
}
}
// Verkaufsstelle i
void verkaufstelle(int i) {
while (true) {
hole-aus-Lager-L(linker-schuh);
hole-aus-Lager-R(rechter-schuh);
verkaufe-schuhe(linker-schuh,rechter-schuh);
}
}





Hier poste ich die Klassen, wie sie jetzt aussehen. Ich habe nämlich jetzt das Problem, dass nur noch "Schuhpaar verkauft" kommt, aber nix mehr in der Richtung, dass etwas nachproduziert wurde. Kann es sein, dass die dazugehörige syso am falschen Ort ist?
Java:
package viertensErstens;

public class LagerLinks {
	int lagerplatzLinks;

	public LagerLinks() {
		lagerplatzLinks = 10;

	}

	public void lagerBefuellenLinks() {
		
		
		if (lagerplatzLinks > 0 && lagerplatzLinks <= 10) {
			lagerplatzLinks--;
			System.out.println("Linkes Lager befuellt: " + lagerplatzLinks);
		}
		}
		

//		else {
//			//System.out.println("Linkes Lager voll!");
//		}

	
	public void lagerEntleerenLinks(){
		if(lagerplatzLinks >= 0 && lagerplatzLinks < 10 ){
			lagerplatzLinks++;
			System.out.println("Linkes Lager entleert: " +  lagerplatzLinks);
			
		}
	}
}
Java:
package viertensErstens;

public class LagerRechts {
	 int lagerplatzRechts;
	
	public LagerRechts(){
		lagerplatzRechts = 10;
	}
	public void lagerBefuellenRechts() {
		
		if (lagerplatzRechts > 0 && lagerplatzRechts <= 10){
			lagerplatzRechts--;
		System.out.println( "Rechtes Lager befuellt: " + lagerplatzRechts);}

		else {
			//System.out.println("Rechtes Lager voll!");
		}
	
	}
	public void lagerEntleerenRechts(){
		if(lagerplatzRechts >= 0 && lagerplatzRechts < 10 ){
			lagerplatzRechts++;
			System.out.println("Rechtes Lager entleert: " +  lagerplatzRechts);
			
		}
	}
}
Java:
package viertensErstens;

public class ProduzentLinks extends Thread {

	private LagerLinks links = new LagerLinks();

	public ProduzentLinks() {

	}

	public void run() {
		while (true) {
			links.lagerBefuellenLinks();

		}
	}
}
Java:
package viertensErstens;

public class ProduzentRechts extends Thread {
	private LagerRechts rechts = new LagerRechts();

	public ProduzentRechts() {

	}

	public void run() {
		while (true) {
			rechts.lagerBefuellenRechts();
		}
	}

}
Java:
package viertensErstens;

import java.util.concurrent.Semaphore;

public class Verkaufsstelle extends Thread {
	private LagerLinks links = new LagerLinks();
	private LagerRechts rechts = new LagerRechts();
	Semaphore s = new Semaphore(1);

	public Verkaufsstelle() {

	}

	public void run() {
		while (true) {
			try {
				s.acquire();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			links.lagerEntleerenLinks();
			rechts.lagerEntleerenRechts();
			System.out.println("Schuhpaar verkauft." + links.lagerplatzLinks +" "  + rechts.lagerplatzRechts);
			s.release();
		}

	}

	public static void main(String[] args) {
		Thread produzentLinks = new ProduzentLinks();
		produzentLinks.start();
		Thread produzentRechts = new ProduzentRechts();
		produzentRechts.start();
		Thread verkaufsstelle = new Verkaufsstelle();
		verkaufsstelle.start();

	}
}
 

Michael...

Top Contributor
Die Aufgabenstellung ist recht wage. Hier ist von einer Schuhfabrik die Rede und man könnte (und ich würde das evtl. das sogar trotz aufgestellter Nackenhaare) so interpretieren, dass es eine Klasse Schuhfrabrik gibt, welche die aufgelistenen Methoden besitzt. In der Schuhfabrik laufen einzelne Threads in denen jeweils die Methoden aufgerufen werden. Mehr kann ich aus dem Kontext heraus nicht erkennen nichts von Produzentenklassen, Lagerklassen (die sicherlich Sinn machen würden) und Verkaufsklassen, die eigene Lager besitzen. Egal.

Zu Deinem Code:
- die Verwendung der Semaphore nutzt so nichts (ich weiß ich wiederhole mich)
- es werden unabhängig davon, ob Schuhe im Lager vorhanden sind fleißig - was auch immer - verkauft
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Threads Neuen Thread nicht aus main-Methode starten Java Basics - Anfänger-Themen 3
G Methode nicht im Event-Dispatcher-Thread starten? Java Basics - Anfänger-Themen 2
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
P Threads Im Dialog geöffneter Thread zeichnet nicht Java Basics - Anfänger-Themen 4
J Thread interrupt funktioniert nicht Java Basics - Anfänger-Themen 5
R Threads ArrayList in Thread nicht modifizierbar? Java Basics - Anfänger-Themen 22
U Thread reagiert nicht sofort auf Tastendruck Java Basics - Anfänger-Themen 14
El_Lobo Threads bekomme Thread nicht abgewürgt mit interrupted() Java Basics - Anfänger-Themen 3
C Warum wird der Thread nicht beendet ? Java Basics - Anfänger-Themen 7
G Thread beendet nicht Java Basics - Anfänger-Themen 6
sylo Bekomme Thread nicht gleichzeitig gestartet. Java Basics - Anfänger-Themen 12
U THREAD stoppt bzw. schläft nicht!!!! Java Basics - Anfänger-Themen 12
A Trotz Thread ist Program nicht erreichbar Java Basics - Anfänger-Themen 3
L Thread oder Nicht-Thread in Ticker-Applet Java Basics - Anfänger-Themen 7
T Thread tickt nicht richtig Java Basics - Anfänger-Themen 4
R Thread startet nicht, verstehe nicht warum Java Basics - Anfänger-Themen 2
M Simple Animation funktioniert nicht (JFrame, Canvas, Thread) Java Basics - Anfänger-Themen 6
B Thread will einfach nicht stoppen Java Basics - Anfänger-Themen 12
G nach Thread.start(); nochmal start(); aufrufen geht nicht Java Basics - Anfänger-Themen 4
W Kann Thread nicht richtig beenden. Java Basics - Anfänger-Themen 11
G Mein erster Thread funktioniert nicht. Java Basics - Anfänger-Themen 3
7 Thread will nicht stoppen Java Basics - Anfänger-Themen 2
I Thread funktioniert nicht Java Basics - Anfänger-Themen 10
8 Wieso krieg ich den Thread nicht angehalten? Java Basics - Anfänger-Themen 2
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 Producer - Consumer Java Basics - Anfänger-Themen 1
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

Ähnliche Java Themen

Neue Themen


Oben