synchronized threads

Biobauer

Mitglied
Hallo,

Ich bin neu - sowohl in der Community als auch in Java.
Ich lerne gerade Java und schau mir schonmal die Sachen von nächstem Semester an.
Ich wollte die gerade die Probeklausur lösen und bin rasch durchgekommen (4 von 5 Aufgaben).
Allerdings machen mir den ganzen Tag schon die Threads zu schaffen.
Im Prinzip verstehe ich was ein Thread ist und wie er funktioniert, verstehe aber nicht was hier von mir verlangt wird , bzw ich ich es umsetzte.

Hier die Aufgabe :

a) Entwickeln Sie im Package de.fh_lu.o2spruef.huehner als Unterklasse von Henne eine
Runnable-Klasse RennHenne. Diese soll ein Attribut pos (Datentyp int), ein Attribut appl (Datentyp
Object) und ein Attribut thr (Datentyp Thread) besitzen.
b) Bei der Erzeugung einer RennHenne soll ein Objekt mitgegeben werden, das im Attribut appl
gespeichert wird. Außerdem soll pos auf 0 gesetzt werden. Nachträglich muss es möglich sein, das
Attribut thr zu setzen.
c) Die run()-Methode der RennHenne soll in einer Endlosschleife solange erst pos erhöhen und dann
die Methode info(pos, <Name der Henne>) an das Objekt appl schicken, bis thr interrupted wird.
d) Entwickeln Sie eine Applikation HennenRennen, die
 10 RennHennen in je einem Thread startet,
 bei jeder RennHenne den Thread einträgt und
 eine Methode synchronized info(int pos, String name) bereitstellt, die folgendes tut:
- Wenn pos >= 100000 ist, dann werden alle Threads interrupted und
- es erfolgt die Ausgabe „HennenRennen Beendet, RennHenne <name> hat gewonnen.“

Hier den Teil den ich in der Aufgabe vorher schon implementiert habe :

Java:
public class Henne {

	String name;
	Ei ei;
	
	
	public Henne(String name,Ei ei) {
		this.ei = ei;
		this.name = name;
	}
	
	public void checkEi(){
		
		KeinEiException e = new KeinEiException();
		if (this.ei == null){throw e;}
		
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Ei getEi() {
		return ei;
	}
	public void setEi(Ei ei) {
		this.ei = ei;
	}
	
	public String toString(){
		
		String string = "Die Henne heißt " + this.name + " ";
		try {this.checkEi();
		return string + this.ei.toString();
		} catch(Exception e) { return string+e.getMessage();}
	}
	
}


public class Ei {
	
	String farbe;
	double groesse;
	
	public Ei(String farbe, double groesse){
		this.farbe=farbe;
		this.groesse = groesse;
	}
	
	public String getFarbe() {
		return farbe;
	}
	public void setFarbe(String farbe) {
		this.farbe = farbe;
	}
	public double getGroesse() {
		return groesse;
	}
	public void setGroesse(double groesse) {
		this.groesse = groesse;
	}

	public String toString(){
		return "Das Ei hat die Farbe " + this.farbe + " und ist " + this.groesse + "cm groß. "; }
}


public class KeinEiException extends ArithmeticException {

	public KeinEiException (){
		super("Diese Henne hat kein Ei. ");
	}
}

public class RennHenn extends Henne implements Runnable {

	
	int pos;
	static Object appl = new Object();
	Thread thr;
	
	public RennHenn(String name, Ei ei, Object obj) {
		super(name, ei);
		this.appl = obj;
	this.pos = 0;
		// TODO Auto-generated constructor stub
	}

	
	
	@Override
	public void run() {
		
		while(!this.thr.isInterrupted()){
		
			this.pos++;
			
		}
	}
	
		
		// TODO Auto-generated method stub

	


	public void setThr(Thread thr) {
		this.thr = thr;
	}

	/**
	 * @param args
	 */


}


vorallem Teilaufgabe c) verwirrt mich, an dem ich eine Methode an ein Objekt schicken soll.

schonmal danke im vorraus

Mfg Biobauer
 
Zuletzt bearbeitet von einem Moderator:

TKausL

Top Contributor
Steht es genau so in deinem Aufgabenblatt 1zu1?
Irgend eine Ahnung was "appl" bedeuten könnte?

1.: Object besitzt info() nicht, dh. du kannst die Methode garnicht aufrufen
2.: Wie man eine Methode an ein Object schickt weiß ich auch nicht... Schlecht formuliert?

E: sehe grade: Die info() soll in die Applikation (HennenRennen) implementiert werden. Dementsprechend müsste der Datentyp von appl HennenRennen und nicht Object sein. Natürlich könntest du das object jedesmal casten beim Aufruf aber das ist sehr sehr unschön. Ich finde, die Aufgaben sind unsauber formuliert. Frag lieber nochmal nach was mit "Datentyp Object" gemeint ist und weise deinen Prof darauf hin, dass es unsinnig ist den Datentypen Object zu verwenden, da du nur soweit abstraktieren (richtiges Wort?) darfst, solange die Methoden die du benutzt noch verfügbar sind.
 
Zuletzt bearbeitet:

Biobauer

Mitglied
Ich habe die 2 Klassen nun folgendermaßen weiterimplementiert ...

Java:
public class RennHenn extends Henne implements Runnable {

	
	int pos;
	HennenRennen appl;
	Thread thr;
	
	public RennHenn(String name, Ei ei, HennenRennen appl) {
		super(name, ei);
		this.appl = appl;;
	this.pos = 0;
		// TODO Auto-generated constructor stub
	}

	
	
	@Override
	public void run() {
		
		while(!this.thr.isInterrupted()){
		
			this.pos++;
			appl.info(this.pos, this.name);
			
		}
	}
	
		
		// TODO Auto-generated method stub

	


	public void setThr(Thread thr) {
		this.thr = thr;
	}

	/**
	 * @param args
	 */


}



public class HennenRennen {

	static HennenRennen abc = new HennenRennen();
	static RennHenn henne1;
	static RennHenn henne2;
	static RennHenn henne3;
	static RennHenn henne4;
	static RennHenn henne5;
	static RennHenn henne6;
	static RennHenn henne7;
	static RennHenn henne8;
	static RennHenn henne9;
	static RennHenn henne10;

	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		henne1 = new RennHenn("Henne1",new Ei ("weiss", 6), abc);
		henne2 = new RennHenn("Henne2",new Ei ("weiss", 6), abc);
		henne3 = new RennHenn("Henne3",new Ei ("weiss", 6), abc);
		henne4 = new RennHenn("Henne4",new Ei ("weiss", 6), abc);
		henne5 = new RennHenn("Henne5",new Ei ("weiss", 6), abc);
		henne6 = new RennHenn("Henne6",new Ei ("weiss", 6), abc);
		henne7 = new RennHenn("Henne7",new Ei ("weiss", 6), abc);
		henne8 = new RennHenn("Henne8",new Ei ("weiss", 6), abc);
		henne9 = new RennHenn("Henne9",new Ei ("weiss", 6), abc);
		henne10 = new RennHenn("Henne10",new Ei ("weiss", 6), abc);

		henne1.run();


		
		
	}
	
	synchronized void info(int pos, String name){
		
	if (pos>=10000)	{
		henne1.thr.interrupt();
		henne2.thr.interrupt();
		henne3.thr.interrupt();
		henne4.thr.interrupt();
		henne5.thr.interrupt();
		henne6.thr.interrupt();
		henne7.thr.interrupt();
		henne8.thr.interrupt();
		henne9.thr.interrupt();
		henne10.thr.interrupt();
		
		System.out.println(name+pos);
	
		
		
	}
	}

}

ich bekomme aber nun eine Null Pointer Exception und verstehe nicht warum ....
Welche Klasse soll man hier abstrakt gestalten und warum?

Mfg Biobauer
 
S

SlaterB

Gast
> ich bekomme aber nun eine Null Pointer Exception und verstehe nicht warum ....

weil du nicht weißt was eine NullPointerException ist oder wo liegt das Problem?
NullPointerException ist eine der obersten Exceptions auf der Skala, die keine Fragen offen lassen,
ein Objekt ist null und darauf wird zugegriffen, geht es noch einfacher?

welche Zeile betroffen ist oder sonstige Informationen verrätst du nicht,
sieht pauschal so aus als wäre thr betroffen: überall verwendet aber ob die set-Methode aufgerufen wird ist nicht zu erkennen

wenn thr null ist dann gehen die Aufrufe darauf kaputt,
wirklich schwer zu erkennen?


direkt run() an einem Runnable aufzurufen ist übrigens ganz normale Methodenausführung,
für Nebenläufigkeit + interrupt braucht es tatsächlich Thread-Objekte, fehlen bisher anscheinend komplett
 

Biobauer

Mitglied
Exception in thread "main" java.lang.NullPointerException
at RennHenn.run(RennHenn.java:21)
at HennenRennen.main(HennenRennen.java:33)

while(!this.thr.isInterrupted()){
 
M

maki

Gast
Ein Thread verändert [c]thr[/c], ein andere soll die Änderung sehen, du musst "synchronisieren".
Für [c]appl[/c] und [c]pos[/c] gilt dasselbe.

EIn simples volatile reicht nicht, denn du musst sicherstellen dass alle drei Variablen zur gleichen Zeit synchron sind, entweder synchronized (als block oder an die methode), oder mit locks arbeiten.

Ansonsten hilft es wenn [c]thr[/c] gesetzt wird ;)
 
S

SlaterB

Gast
wenn man auf den Schlauch steht, dann in aller Ruhe die Programmanforderungen zurückfahren und über die Grundlagen nachdenken,
kannst du einen Thread starten, unter Beteiligung der Klasse Thread?
das lohnt sich in einem eigenen kleinen Testprogramm zu lernen
 
M

maki

Gast
[c]setThr[/c] wird nie aufgerufen, deswegen ist [c]thr==null[/c].
Aber selbst wenn das gemacht ist, muss noch synchronisiert werden.

SlaterBs Vorschlag ist auf jedenfall Goldrichtig, wenn du dich mit Multithreading auseinandersetzen willst, solltest du schon vorher in der Lage sein einfachere NPEs wie hier zu finden.
 

Biobauer

Mitglied
Ich bin jetzt bei folgendem Ergebniss :

Java:
public class RennHenn extends Henne implements Runnable {

	
	int pos;
	HennenRennen appl;
	Thread thr;
	
	public RennHenn(String name, Ei ei, HennenRennen appl) {
		super(name, ei);
		this.appl = appl;;
	this.pos = 0;
		// TODO Auto-generated constructor stub
	}

	
	
	@Override
	public void run(){
		
		while(!thr.isInterrupted()){
		
			this.pos++;
			appl.info(this.pos, this.name);
			
		}
	}
	
		
		// TODO Auto-generated method stub

	


	public void setThr(Thread thr) {
		this.thr = thr;
	}

	/**
	 * @param args
	 */


}


public class HennenRennen {

	static HennenRennen abc = new HennenRennen();
	static RennHenn henne1;
	static RennHenn henne2;
	static RennHenn henne3;
	static RennHenn henne4;
	static RennHenn henne5;
	static RennHenn henne6;
	static RennHenn henne7;
	static RennHenn henne8;
	static RennHenn henne9;
	static RennHenn henne10;

	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		henne1 = new RennHenn("Henne1",new Ei ("weiss", 6), abc);
		henne2 = new RennHenn("Henne2",new Ei ("weiss", 6), abc);
		henne3 = new RennHenn("Henne3",new Ei ("weiss", 6), abc);
		henne4 = new RennHenn("Henne4",new Ei ("weiss", 6), abc);
		henne5 = new RennHenn("Henne5",new Ei ("weiss", 6), abc);
		henne6 = new RennHenn("Henne6",new Ei ("weiss", 6), abc);
		henne7 = new RennHenn("Henne7",new Ei ("weiss", 6), abc);
		henne8 = new RennHenn("Henne8",new Ei ("weiss", 6), abc);
		henne9 = new RennHenn("Henne9",new Ei ("weiss", 6), abc);
		henne10 = new RennHenn("Henne10",new Ei ("weiss", 6), abc);
		Thread t1= new Thread();
		Thread t2= new Thread();
		Thread t3= new Thread();
		
		
	henne1.setThr(t1);
	henne2.setThr(t2);
	henne3.setThr(t3);
	
		henne1.thr.start();
		henne1.run();
		
		henne2.thr.start();
		henne2.run();

		henne3.thr.start();
		henne3.run();



		
		
	}
	
	synchronized void info(int pos, String name){
		
	if (pos>=10000)	{
		henne1.thr.interrupt();
		henne2.thr.interrupt();
		henne3.thr.interrupt();

		
		System.out.println(name+pos);
	
		
		
	}
	}

}

Nun bekomm ich in der Console entweder angezeigt, dass alle Threads bis 10000 laufen ... oder Sie laufen sogar ins unendliche ....
 

Crian

Top Contributor
Java:
    static RennHenn henne1;
    static RennHenn henne2;
    static RennHenn henne3;
    static RennHenn henne4;
    static RennHenn henne5;
    static RennHenn henne6;
    static RennHenn henne7;
    static RennHenn henne8;
    static RennHenn henne9;
    static RennHenn henne10;

Sicher? Keine Liste? Kein Array? Wirklich ... 10-facher Code überall?
 
S

SlaterB

Gast
deine Threads sind nicht mit den Runnable verknüpft, sie als Attribut zu setzen hat keine Wirkung,
immer noch rufst du die run()-Methode direkt auf, wird nicht nebenläufig vom main-Thread ausgeführt

was hält dich davon ab, erstmal EIN Runnable mit Dummy-Befüllung in einem leeren Programm als Thread zu üben?

'java runnable thread example' ist auch schnell in jede Suchmaschine eingetippt
Defining and Starting a Thread (The Java™ Tutorials > Essential Classes > Concurrency)
 

Biobauer

Mitglied
gut also wenn ich im Konstruktor

Java:
 this.thr = new Thread(this);

einfüge und den Rest entsprechend ändere funktioniert es....

Also ich Starte einen Thread von einem runnable Object ...

aber wie sage ich in der Methode info, dass alle RennHennen ihren thread beenden sollen, die methode info benutzen ... (info ist synch).
 
S

SlaterB

Gast
so wie du es hast mit Einzelaufrufen ist es nicht allzu verkehrt, alle Threads unterbrechnen, die müssen nicht gerade info() aufrufen oder so,
eine Liste der Threads wäre komfortabler zu durchlaufen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
B warum schließt synchronized andere threads nicht aus? Java Basics - Anfänger-Themen 7
I Synchronized Threads Java Basics - Anfänger-Themen 4
R Problem: Threads Synchronized machen Java Basics - Anfänger-Themen 5
M OOP Synchronized Methoden, zugriff aus Threads Java Basics - Anfänger-Themen 4
X Threads und synchronized - Verständnisproblem Java Basics - Anfänger-Themen 3
M Kleines Problem mit Threads (synchronized) Java Basics - Anfänger-Themen 3
S bin zu blöd für threads - wait, notify, synchronized Java Basics - Anfänger-Themen 11
S Threads: synchronized mach nicht was es soll? Java Basics - Anfänger-Themen 6
L Threads und synchronized Java Basics - Anfänger-Themen 8
A Problem mit Threads und synchronized Java Basics - Anfänger-Themen 3
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
A Thread - Synchronized Java Basics - Anfänger-Themen 10
O synchronized Java Basics - Anfänger-Themen 39
O synchronized difference Java Basics - Anfänger-Themen 5
E Synchronisierte Methoden vs. Synchronized(lockObject) Block Java Basics - Anfänger-Themen 7
T Was bringt das synchronized bei der Methode? Java Basics - Anfänger-Themen 12
temi Synchronized(Monitor) Java Basics - Anfänger-Themen 2
Shams Synchronized-Schlüsselwort bei Inkrementierung einer statischen Variable Java Basics - Anfänger-Themen 13
V Parameter in synchronized-Blöcken verstehen Java Basics - Anfänger-Themen 2
M Threads synchronized und wait Java Basics - Anfänger-Themen 2
N Threads Probleme mit synchronized Java Basics - Anfänger-Themen 9
J Threads Synchronized Java Basics - Anfänger-Themen 6
U synchronized / lock Java Basics - Anfänger-Themen 8
P Arraylist synchronized? Java Basics - Anfänger-Themen 6
X3TitanCore Methoden synchronized bei einer Methode Java Basics - Anfänger-Themen 2
P synchronized methoden Java Basics - Anfänger-Themen 3
M Synchronized klappt nicht Java Basics - Anfänger-Themen 11
E synchronized Methoden Java Basics - Anfänger-Themen 3
M synchronized( ref ) Java Basics - Anfänger-Themen 3
S Fragen zu synchronized + Singleton! Java Basics - Anfänger-Themen 10
J simple Frage zu synchronized Java Basics - Anfänger-Themen 4
R wait() in synchronized - Block oder nicht? Java Basics - Anfänger-Themen 4
X Synchronized Zugriff ArrayList<E> Java Basics - Anfänger-Themen 6
G synchronized Java Basics - Anfänger-Themen 5
M synchronized variables? Java Basics - Anfänger-Themen 8
B Verständnissfrage synchronized Java Basics - Anfänger-Themen 2
S Warum wirkt hier synchronized nicht? Java Basics - Anfänger-Themen 9
C Trotz "synchronized" unerwartete Ausgabe Java Basics - Anfänger-Themen 2
E Synchronized - Methoden in verschied. Klassen Java Basics - Anfänger-Themen 3
C synchronized Java Basics - Anfänger-Themen 2
J Fragen zu Synchronized Java Basics - Anfänger-Themen 6
T synchronized HashMap Java Basics - Anfänger-Themen 7
L Problem mit synchronized und String Java Basics - Anfänger-Themen 2
B Was bedeutet synchronized? Java Basics - Anfänger-Themen 8
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
W Threads Alphabet Java Basics - Anfänger-Themen 20
H Threads Anfänger Java Basics - Anfänger-Themen 17
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13
A Threads und .join Java Basics - Anfänger-Themen 14
W Threads starten Java Basics - Anfänger-Themen 2
J Wieviele threads? Java Basics - Anfänger-Themen 9
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
O Threads Java Basics - Anfänger-Themen 2
L Buchungssystem und Threads Java Basics - Anfänger-Themen 2
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
S Gemeinsame Ressource und Mehrfachinstanziierung von Threads Java Basics - Anfänger-Themen 16
S Verklemmung Threads Java Basics - Anfänger-Themen 11
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
M Threads run Methode Java Basics - Anfänger-Themen 4
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
J Aufgabe(Threads) richtig verstanden/implementiert Java Basics - Anfänger-Themen 27
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
J Threads Java Basics - Anfänger-Themen 38
D Alte Klausuraufgabe Threads Java Basics - Anfänger-Themen 10
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
R Threads in JavaFX Java Basics - Anfänger-Themen 3
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
J ConcurrentCalculation Multi Threads in Java Java Basics - Anfänger-Themen 3
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
M "restartable" threads Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben