Threads Thread Zugriffsproblem

Skippi

Mitglied
Hallo liebe Community,

im Rahmen eines Programmierpraktikums gilt es folgende Aufgabe zu lösen:

Ein Benutzer kauft mehrere Artikel ein ...
Diese werden alle in eine ArrayList<Artikel> tempCart eingelesen.

Jetzt geht der Benutzer hin und sagt: "Bestellung abschließen"

Nun sollen 5 Roboter (Threads) alle Artikel des tempWarenkorbes (tempCart) aus dem Lager suchen und und die Anzahl des Artikels im Lager um 1 minimieren.

Das Problem ist: wenn ersteinmal run() aufgerufen wird, kann ich weder set. noch get. Methoden verwenden um irgendwie an die Attribute ranzukommen ...

Ich habe nun versucht den Threads irgendetwas mitzugeben (z.B den Artikel der im Lager gesucht werden soll) ... Hier besteht jedoch auch das Problem, dass ich zwar den Artikel habe... aber nicht an das Lager rankomme ... :(

Habt ihr für mich einen Lösungsansatz?

Liebe Grüße
 
S

SlaterB

Gast
> Das Problem ist: wenn ersteinmal run() aufgerufen wird, kann ich weder set. noch get. Methoden verwenden um irgendwie an die Attribute ranzukommen ...

inwiefern dieses Problem besteht erklärst du nicht,
ist das eine fachliche Vorgabe für mehr Rätsel in der Aufgabe oder hast du ein bestimmtes Java-Problem?

> Hier besteht jedoch auch das Problem, dass ich zwar den Artikel habe... aber nicht an das Lager rankomme

dito,
ohne Code und/ oder weitere Hinweise/ Erklärungen kann man solche Fragen doch nicht behandeln

-------

> Jetzt geht der Benutzer hin und sagt

hmm, habe ich das schon seit Ewigkeiten nicht mehr gelesen?, erstaunlich,
eine schmerzhafte Redewendung, die ich hier gleichmal anmeckern will ;)
niemand wechselt den physikalischen Ort, der Benutzer sagt ganz einfach was, wenn überhaupt
 

Skippi

Mitglied
Java:
Lager(String lagerBezeichnung){
		this.lagerBezeichnung = lagerBezeichnung;
		lagerbestand = new ArrayList<Artikel>(); //Alle Artikel die im Lager sind
		tempCart = new ArrayList<Artikel>(); //Hier werden Produkte die "gekauft" werden zwischengespeichert
		listeRoboter = new ArrayList<Roboter>(); //Hier befinden sich die Roboter drin (5 Threads)
	}

Nun soll eine Methode z.B

Java:
public void bestellungAbschliessen(){

            //TODO: Bestellung abschließen
}

den Robotern sagen, dass sie jeweils alle Artikel des des tempCarts suchen und diese im lager um 1 minimieren.

Ich weis nur nicht wie ich auf das Lager zugreifen soll ... bzw wie ich es umstrukturieren könnte, um das selbe zu bezwecken.

Verständlich?
 
S

SlaterB

Gast
wenig, reicht nur für Standard-Hinweise:
es gibt also irgendwo ein erzeugtes Lager-Objekt,
das brauchst du also in der Methode bestellungAbschliessen(), wo immer die ist,

Objekt-Verteilung ist ein allgemeines Thema, wenn das Lager von der main erzeugt wurde sollten es alle anderen Klassen bekommen können,
sonst noch weiter von A nach B, von B nach C usw.


wenn du das Lager hast und dort etwas aus tempChart brauchst, dann hole das dort raus,
wenn du die Roboter brauchst, hole sie aus listeRoboter im Lager usw.
 

Skippi

Mitglied
Schon einmal danke!
Ich wollte hier nicht den ganzen Code posten ... (Platzgründe)

Die Objekte, die ich oben erwähnt habe, sind selbstverständlich alle erzeugt:

Java:
public static void main(String[] args) {
		
		//Lagerverwaltung anlegen
		Lagerverwaltung lagerverwaltung1 = new Lagerverwaltung("Hauptlagerverwaltung");
		
		//Lager anlegen
		Lager lager1 = new Lager("Lager für Musikinstrumente");
		lagerverwaltung1.addLager(lager1);
		
		//Artikel anlegen && Lager zuweisen
		Artikel artikel1 = new Artikel("Keyboard", 10, 40);
		lager1.neuenArtikel(artikel1);
		
		//2,3...
		
		Artikel artikel4 = new Artikel("Schlagzeug", 15, 50);
		lager1.neuenArtikel(artikel4);
		
		
		//Roboter anlegen
		
		Roboter roboter1 = new Roboter();
		lager1.neuenRoboter(roboter1);
		
	        //2,3,4...
		
		Roboter roboter5 = new Roboter();
		lager1.neuenRoboter(roboter5);
				
		//Ausgeben
		lagerverwaltung1.ausgeben();
		
	}

Class Roboter:

Java:
import java.util.ArrayList;

public class Roboter extends Thread{
	
	//Deklaration
	private Artikel tempArtikel;
	
	Roboter(){
	}
	
	public void run(){
		
		//HIER soll der Roboter den Artikel aus dem Lager entfernen...
		
	}
	
	public void setTempArtikel(Artikel tempArtikel){
		this.tempArtikel = tempArtikel;
	}
	
	
}
 
S

SlaterB

Gast
besteht aktuell eine Frage? dein Posting gibt eher neue Rätsel auf,
was dich bei bestellungAbschliessen() hindert ist nicht erklärt, die Methode taucht hier auch nicht auf

minimal angedeutet wird nun ein Problem für den Roboter-Thread,
zu dem auch wieder nur zu sagen ist, dass der Roboter eben das Lager kennen muss,
als Parameter im Konstruktor übergeben bzw. per set-Methode ähnlich setTempArtikel(), schon wäre das Lager bekannt
 
N

nillehammer

Gast
SlaterB hat's schon geschrieben, ein Roboter muss das Lager kennen, in dem er rumfährt. Ich würde das als Konstruktorparameter machen:
Java:
/** Das Lager, in dem ich rumfahre und Artikel zusammensuche */
private final Lager meinLager;


 Roboter(final Lager meinLager){
    this.meinLager = meinLager;
    meinLager.neuenRoboter(this);
 }
In dem Zusammenhang ist zu prüfen, ob das Lager überhaupt seine Roboter kennen muss. Falls ja, muss die Beziehung von beiden Seiten konsistent sein. Deswegen habe ich das in den Konstruktor mit eingebaut. Die entsprechenden Aufrufe im Hauptprogramm entfallen dann natürlich.
 

Skippi

Mitglied
was dich bei bestellungAbschliessen() hindert ist nicht erklärt, die Methode taucht hier auch nicht auf

Ein Benutzer kauft mehrere Artikel ein ...
Diese werden alle in eine ArrayList<Artikel> tempCart eingelesen.

Jetzt geht der Benutzer hin und sagt: "Bestellung abschließen"

Nun sollen 5 Roboter (Threads) alle Artikel des tempWarenkorbes (tempCart) aus dem Lager suchen und und die Anzahl des Artikels im Lager um 1 minimieren.

als Parameter im Konstruktor übergeben bzw. per set-Methode ähnlich setTempArtikel(), schon wäre das Lager bekannt

Ja, das Problem ist aber doch, dass 5 Roboter gleichzeitig sich um dieses tempCart kümmern ... Sie sollen gleichzeitig die Artikel aus dem Lager löschen ...

Wenn ich jetzt einfach nur das Lager via Konstruktor bzw. Set reingebe, besitzt doch jeder Roboter ein anderes Lager sprich roboter1.lager != roboter2.lager (mal syntaktisch falsch ausgedrückt).

Alle Roboter müssen ja aufs selbe Lager zugreifen und genau DAS ist mein Problem... ???:L
 
S

SlaterB

Gast
Teile des ersten Postings, inklusive der von mir (spaßeshalber) angemeckerten Hingehen-Redewendung zu wiederholen ist nicht grad hilfreich

zum Rest: ja wer sagt denn dass jeder ein anderes Lager bekommt?
ich habe doch gesagt: ein Lager erzeugen, das an alle verteilen,
so ist der Standard, und dann haben auch wirklich alle dasselbe Lager,

du fügst im Moment doch auch schon alle Roboter in dasselbe Lager ein,
woher hast du die Idee auf einmal an unterschiedliche Lager zu denken?

Parameterübergabe macht keine automatischen Kopien, falls du das denkst,
dann würden beim Lager ja über neuenRoboter() auch andere Roboter ankommen usw.,

-----

der gleichzeitige Zugriff kann für sich noch Probleme machen,
zwischen mehreren Threads synchronisiert man den Zugriff auf gemeinsame Daten,
das ist in den Grundlagen zu Threads nachzulesen, falls dir 'synchronized' nicht bekannt ist
 
Zuletzt bearbeitet von einem Moderator:
F

FHDortmund_PK1

Gast
Hallo Lieber skippi,

für genau solche Fragen ist das Praktikum an der FH-Do gedacht, und dafür gibt es Tutoren die dir dort bei Problemen helfen können. Die Praktika werden sogar mehrmals täglich angeboten, und passen bestimmt mind. einmal in dein Stundenplan.
Zudem hast du anscheinend noch die ein oder andere Wissenslücke, was die Basics angeht weshalb extra ein Tutorium angeboten wird wo solche Themen behandelt werden.
Zudem würde ich bedenken, dass eine nicht eigenständig erstellte Lösung zum Verlust deiner Bonuspunkte führen könnte.

Viele Grüße
Dein PK1-Tutor
 

badr1200

Neues Mitglied
Bitte um hilfe,

kann jemand mir erklären die folgende quellcode:

[JAVA=30]
public static void sortiereNachSuchzeit(ArrayList<Artikel> artikel) {
try {
for (int i = 0; i < artikel.size(); i++) {
for (int j = i + 1; j < artikel.size(); j++) {
if (artikel.get(j).getSuchzeit() < artikel.get(i).getSuchzeit()) {
Artikel tmp = artikel.get(i);
artikel.set(i, artikel.get(j));
artikel.set(j, tmp);
}
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}

[/code]

danke im voraus.
 

XHelp

Top Contributor
Das sieht weniger nach Bubblesort aus, sondern eher nach einem SelectionSort mit übertrieben vielen unnötigen Tauschoperationen
 

Neue Themen


Oben