Java Concurrency

Hallo Experten,

ich brauche Eure Hilfe für eine kleine Aufgabe. Und zwar geht es darum, dass ich ein Java-Programm entwickeln soll, welches zwei Threads startet, wobei der eine Thread „Thread1“ und der andere Thread „Thread2“ ausgeben soll. Wenn ich im Hauptprogramm eine for-Schleife erstellt, die bis 10 iteriert, soll folgende Ausgabe erscheinen:

Thread1
Thread2
Thread1
Thread2
Thread1
Thread2
Thread1
Thread2
Thread1
Thread2

Die Threads sollen sich somit synchronisieren. Ich habe bisher mehrere Methoden hierfür gesehen. Allerdings sahen sie recht kompliziert aus und beinhalteten eine eigene Mutex-Klasse mit Synchronisationsblock. Gibt es ggf. einen einfacheren Weg die beiden Threads zu syncen?

Danke für Eure Antworten!

hallo, aus dem informatik-studium kann ich dir nur sagen: implementiere mutexe, das ist wichtig!

Für das Problem sollte aber folgendes klappen:
Eine globale boolean-variable
Eeine eigene klasse für den thread, zwei funktionen, printWas und toggle, beide synchronised (nicht unterbrechbar) printWas wartet per schleife ob die globale variable true ist, wenn thread id=0 sonst folgt die ausgabe. Danach wird toggle aufgerufen. Der invertiert die globale variable.
Ausführlicher kann ichs vom smartphone gerade nicht erklären.
Evtl mal in java ist auch nur eine insel nach threadsynchronisation schauen

Grüße, Weiti

Hallo,

schau mal hier:
http://openbook.galileocomputing.de/javainsel9/javai…

Da steht einiges, auch ohne Mutex.
Vielleicht ist das dabei was du suchst.

Torsten

Hi.

Also ganz um ein Lock, Monitor, What-Ever wirst du nicht herumkommen. Aber für den Einsatz in dem Szenario - sprich: Zwei Threads - reicht dafür ein einfaches Object an/mit dem gewartet/benachrichtigt wird. Eine kurze Einleitung dazu findest du unter http://openbook.galileocomputing.de/javainsel9/javai…

Mir ist nicht ganz klar wie da die for-Schleife mit hinein spielt. Ich gehe davon aus, dass die Threads selbst die Ausgabe erzeugen.

Tom

Hallo

Die einfachste Lösung hierfür ist eine Global mit einem abfragbaren Boolean, welcher sagt ob Thread1 oder 2 schon gearbeitet hat. Dann machst du ne wait oder besser sleep in dem Thread die dafür sorgt das er wartet bis der andere durch ist. Ich mache sowas für Webcrawler mit bis zu 100 Threads und das geht super. Wenn du noch mehr threads machst würde 8ch allerdings kein int sonderen dann einen text nehmen. So kannst du später auch Angaben prüfen.
Ark

Sorry, habe nächste Woche eine wichtige Deadline und derzeit leider keine Zeit für etwas anderes.

Hallo Maurice,

können sich die Threads nicht gegenseitig joinen? (Oder führt das zu einem Deadlock?)

Schöne Grüße,

Manfred, leider kein Concurrency-Experte

Kann ich dir leider nicht beantworten.

Hallo,

erstmal macht meist nur in Übungen wirklich Sinn, Threads so zu synchronisieren…

siehe dazu z.B. http://openbook.galileodesign.de/javainsel5/javainse…

Einige Mittel dazu sind:

  1. wie erwähnt z.B. mit einem Mutex, (z.B. java.util.concurrent.locks.ReentrantLock)
  2. mit einer BlockingQueue (z.B. java.util.concurrent.LinkedBlockingQueue)
  3. mit Thread.wait() und notify()
  4. mit synchonized() auf ein gemeinsames Objekt

Hallo,

leider kann ich dir erst Freitag Abend antworten. Wenn dir das zu spät ist, muss ich leider absagen. bitte sage mir Bescheid, ob dir das noch reicht.

Viele Grüße

tincian

Hallo,
ich habe eine Lösung für das Problem gefunden, welche sich jedoch eines „Tricks“ bedient. Und zwar ist das die Nutzung eines ThreadPools.
Es werden also nicht selber die Threads erstellt, sondern nur die Runnables:

Runnable t1 = new Runnable() {
@Override public void run() {
System.out.println(„Thread1“);
} };

Runnable t2 = new Runnable() {
@Override public void run() {
System.out.println(„Thread2“);
} };

ExecutorService exe = Executors.newCachedThreadPool();

for (int i = 0; i

Okay, danke! Wechseln sich die Threads in diesem Fall mit der Ausgabe ab?

Bei meinem ersten Versuch haben sie das getan, aber es scheint Zufall gewesen zu sein - sry.

Eine gute Einführung in das Thema Threads und ihre Synchronisation gibt aber das Kapitel 12 der Java-Insel
http://openbook.galileocomputing.de/javainsel/javain…

Dort finden sich auch einige Beispiele, die die Thematik veranschaulichen und sich (mit copy&paste in eine IDE der Wahl) auch ausführen lassen.

kann da leider nicht weiterhelfen, Java ist nicht mehr mein Interessengebiet

VG coxew

Hallo Maurice,

ich bin nicht sicher, ob die Frage noch aktuell ist. Ich bin auch nicht gut darin, die direkt am Codebeispiel zu helfen. Aber ich kann dir mit Stichwörtern helfen.

a) In Java gibt es ein Schlüsselwort „synchronized“ für Methoden. Schau doch mal nach, wofür man das verwenden kann.
b) Es gibt zum Thema Synchronisierung diverse theoretische Konstrukte, z.B. Semaphore, Hoare Monitor, Mutex.

Im konkreten Fall könntest du natürlich auch einfach beide Threads dieselbe Variable benutzen lassen. Da du nur zwei Threads hast, kann Thread 1 ja solange warten (while-Schleife) bis die Variable auf 2 gesetzt wurde. Dann kann sie ihren Job ausführen und die Variable wieder auf 1 setzen. Thread 2 macht es genauso. Das wäre aber sogenanntes „busy waiting“ und belastet den Prozessor erheblich. Das kannst du mit „sleep“ einschränken, also der Thread wartet eine gewisse Zeit bevor er mit der while-Schleife (dem Warten) weitermacht.

Ansonsten noch viel Erfolg :smile:

Liebe Grüße,
Philipp

Hey super, danke Dir vielmals für die Antwort! Ich habe das Problem auch so gelöst. Beide Threads bekommen dieselbe Variable zugewiesen, die dann über eine Synchronized-Methode vom jeweils ausführenden Thread gesetzt wird.