Threads Threads synchronisieren

vaults

Mitglied
Moin Leute,

ich habe grade einen kleinen Thread "Eieruhr" geschrieben. Dieser lässt mich ein Lebensmittel und eine dazugehörige Zeit einlesen.
Nach der eingegebenen Zeit in minuten/sekunden beendet der Thread und ich bekomme eine kleine Nachricht, dass das Lebensmittel fertig ist.

Hier ist der Code des Threads, ich weiß er sieht nicht schön aus :(
Java:
import java.util.InputMismatchException;
import java.util.Scanner;
import java.awt.Toolkit;

public class Eieruhr extends Thread{
	
	long time_start = System.currentTimeMillis() % (1000 * 60 * 60 * 24);
	int hours = (int)(time_start / 1000 / 60 / 60);
	int minutes = (int)(time_start / 1000 / 60) % 60;
	int seconds = (int)(time_start / 1000) % 60;
		
	public synchronized void run(){
		
		try{
			Scanner in = new Scanner(System.in);
			System.out.println("Eingabe: ");
			String name = in.next();
			int input_min = in.nextInt();
			int input_sec = in.nextInt();
			assert (input_min <= 60) && (input_sec <= 60); 
			this.setName(name);
			
			long waitintervall = (long)(input_min * 60000)+(input_sec * 1000);
			System.out.print("Es ist "+hours+":"+minutes+":"+seconds+" Uhr. ");
			
			long p1 = (time_start + waitintervall);
			int hours_p1 = (int)(p1 / 1000 / 60 / 60);
			int minutes_p1 = (int)(p1 / 1000 / 60) % 60;
			int seconds_p1 = (int)(p1 / 1000) % 60;
			
			
			System.out.print("Um "+hours_p1+":"+minutes_p1+":"+seconds_p1+" kommt die Meldung: "+this.getName()+" fertig.\n");
			
			sleep(waitintervall);
		
		}
		catch (InputMismatchException e){System.out.println("Nur Kombinationen der Form <String> <Int> <Int> sind zulässig");}
		catch (AssertionError e){System.out.println("Fehlerhafte Minuten/Sekunden Kombination eingegeben");}
		catch (InterruptedException e){System.out.println("loloo");}
		
		System.out.println(this.getName()+" fertig.");
		Toolkit.getDefaultToolkit().beep();
	}
}

In der Mainmethode erstelle ich nun Objekte der Klasse und starte die Threads
Java:
import java.util.InputMismatchException;
import java.util.Scanner;

public class main {

	public static void main(String[] args) {
		
			Eieruhr t1 = new Eieruhr();
			Eieruhr t2 = new Eieruhr();
			t1.start();
			t2.start();
	}

}

Grundsätzlich arbeitet der Thread korrekt, wenn ich allerdings zwei oder mehrere Threads starte, werde ich auch zweimal direkt zur Eingabe aufgefordert.
Es läuft zwar trotzdem korrekt ab, ist aber unschön.

Hier die komplette Ausgabe:
Code:
Eingabe: 
Eingabe: 
MIlch 0 10
Es ist 8:35:26 Uhr. Um 8:35:36 kommt die Meldung: MIlch fertig.
BUtter 0 5
Es ist 8:35:26 Uhr. Um 8:35:31 kommt die Meldung: BUtter fertig.
BUtter fertig.
MIlch fertig.

Ich hätte es gerne so, dass die Eingabe ein kritischer Bereich ist, und lediglich ein Prozess diesen Betreten kann.
Die Threads sollen weiterhin quasi-parallel laufen, jedoch erst starten wenn die Einhabe abgeschlossen ist.

Vielleicht hat jemand Ideen wie ich dies realisieren kann, würde mich über Hinweise und Tips freuen.

LG,
Alex
 

Michael...

Top Contributor
Ich hätte es gerne so, dass die Eingabe ein kritischer Bereich ist, und lediglich ein Prozess diesen Betreten kann.
Die Threads sollen weiterhin quasi-parallel laufen, jedoch erst starten wenn die Einhabe abgeschlossen ist.
Heißt das, man soll zu erst alle Daten eingeben und danach sollen alle Thread "gleichzeitig" starten? Dann darfst Du die Abfrage/Eingabe nicht innerhalb der Threads machen. Sammle die Eingaben in einer Liste o.ä. wenn die Eingabe abgeschlossen ist, iterierst Du durch die Liste und startest für jede Eingabe einen Thread, der diese "bearbeitet".
 

jemandzehage

Aktives Mitglied
Hi,

da dir kritische Abschnitte schon ein Begriff sind, denke ich, dass du auch weißt, was Semaphoren sind und wie man sie verwendet. Glücklicherweise bietet Java auch eine Implementierung: java.util.concurrent.Semaphore.

Dann erzeugst du einfach eine Semaphore mit einer Kapazität von 1 (also ein Mutex) und rufst beim betreten des kritischen Abschnitts aquire() und beim verlassen release() auf dem Semaphore-Objekt auf. Du solltest die Semaphore natürlich statisch verwenden, damit nur eine angelegt wird.

Gruß
 

vaults

Mitglied
Moin,

du hast mein Anliegen falsch verstanden Michael...., ich wollte nicht beide Eingabefelder gleichzeitig sehen, sondern immer nur eins.

Ich habe das jetzt jemandzehage vorgeschlagen mit den Semaphoren gemacht und habe das korrekte Ergebnis.

Hier meine Lösung:
In der Main-Methode definiere eine Semaphore mit Wert 1, da immer nur ein Thread seinen kritischen Abschnitt betreten soll:
Java:
static Semaphore semaphore = new Semaphore(1);

Im Thread selber importiere
Java:
import java.util.concurrent.Semaphore;

und klammere den kritischen Block mit acquire() und release():
Java:
main.semaphore.acquire();
Scanner in = new Scanner(System.in);
System.out.println("Eingabe: ");
String name = in.next();
int input_min = in.nextInt();
int input_sec = in.nextInt();
assert (input_min <= 60) && (input_sec <= 60); 
this.setName(name);
				
main.semaphore.release();

Jetzt kann nur noch ein Thread pro Zeitintervall seinen kritischen Bereich betreten und die Eingabe läuft seperat ab, danach laufen die Threads normal weiter und melden sich nach der gewünschten Zeit.

LG,
Alex
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
T Threads Threads richtig synchronisieren Java Basics - Anfänger-Themen 3
G Threads synchronisieren von threads Java Basics - Anfänger-Themen 4
Dit_ Methoden-Threads synchronisieren Java Basics - Anfänger-Themen 9
A Datentypen Verschiedene Threads synchronisieren Java Basics - Anfänger-Themen 3
L Mehr als zwei Threads synchronisieren Java Basics - Anfänger-Themen 7
S Threads synchronisieren Java Basics - Anfänger-Themen 4
F 2 Programmteile synchronisieren (Threads?) Java Basics - Anfänger-Themen 3
V Threads verschiedener Klassen synchronisieren Java Basics - Anfänger-Themen 5
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
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
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
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
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
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
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
M Threads - summieren Java Basics - Anfänger-Themen 13
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Threads - Programm analysieren Java Basics - Anfänger-Themen 2
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
D [Concurrency/Threads] Code Umsetzung Schriftlich Java Basics - Anfänger-Themen 2
D Threads Java Basics - Anfänger-Themen 4
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
T Java-Threads Java Basics - Anfänger-Themen 0
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Problem mit Threads Java Basics - Anfänger-Themen 11
M Threads - wo gehören sie hin? Java Basics - Anfänger-Themen 3
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
J Threads Java Basics - Anfänger-Themen 3
F ExecutorService und offene Threads Java Basics - Anfänger-Themen 3
P Threads Threads nicht nebenläufig Java Basics - Anfänger-Themen 7
M Threads nicht nebenleblaufig Java Basics - Anfänger-Themen 2
B Threads parallel zur main Java Basics - Anfänger-Themen 3
M Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M Threads und Methodenübergreifender Variablezugriff Java Basics - Anfänger-Themen 2
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
H Threads Java Basics - Anfänger-Themen 10
B synchronized threads Java Basics - Anfänger-Themen 17
E Mehrmaliges Ausführen eines Threads Java Basics - Anfänger-Themen 5
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
R Threads Verständnisschwierigkeit Java Basics - Anfänger-Themen 2
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
G Methoden in Threads wandeln Java Basics - Anfänger-Themen 7
H Threads Java Basics - Anfänger-Themen 17
F Java Concurrency - Threads Java Basics - Anfänger-Themen 4
T Threads Join() = Block? oO Java Basics - Anfänger-Themen 4
J Threads ArrayList Problem bei Threads Java Basics - Anfänger-Themen 3
C Objekte durchschleifen / Threads Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben