2016-04-18 35 views
0

Ich habe Frage. Ich habe gerade begonnen, Threads zu verwenden und ich bin ziemlich lahm. Ich arbeite an einer Aufgabe.Laufende Threads in bestimmter Reihenfolge

Sagen wir, ich habe 3 Threads. Die Hauptaufgabe eines jeden Threads besteht darin, eine Zeile von .txt usw. bis zum Ende der Datei zu schreiben. Ich habe es geschafft, aber ich weiß nicht, wie man warte() und benachrichtigen(). Mein Programm läuft wie folgt aus:

t1 writes line 
t2 writes line 
t1 writes line 
t2 writes line 
t3 writes line 
t2 
t1 
t2 
t3 
t2 
t1 ... 

, wenn ich mein Thema synchonized einige Objekt. In jeder neuen Thread run() Methode habe ich auch notifyAll() und wait() Methode eingegeben. Aber es dosent Arbeit wie es sein sollte, die ist:

t1 
t2 
t3 
t1 
t2 
t3 
... 

Irgendwelche Tipps Jungs? Ich wäre dankbar.

tldr: Wie t2 zu benachrichtigen, um nach t1 gestartet zu werden, und t3 nach t2 und t1 nach t3 und so weiter?

+0

Geben Sie Ihren Code ein. – shmosel

+3

Die Art und Weise, wie Sie versuchen, Ihre Threads zu ynkronisieren, verletzt den Wert des Threads, dh mehrere Jobs asynchron auszuführen. – ControlAltDel

Antwort

1

Die einfachste Lösung nur Gewinde-Klasse:

thread1.start(); 
thread1.join(); 
thread2.start(); 
thread2.join(); 
thread3.start(); 
thread3.join(); 

Aber es wirklich hilft? Warum sollten Sie sie als Threads erstellen, wenn Sie sie trotzdem sequenziell ausführen möchten?

+0

Dieser Weg tötet meine Fäden und ich möchte das nicht tun. Sie müssen im Hintergrund arbeiten und darauf warten, dass sie an die Reihe kommen. – iboan

+1

Oder nur 'thread1.run(); thread2.run(); thread3.run(); ';) + 1 –

0

Sie müssen im Hintergrund arbeiten und warten, bis sie an der Reihe sind.

In diesem Fall können Sie einen Thread alle ausführen lassen.

Wie t2 nach t1, t3 nach t2 und t1 nach t3 und so weiter zu benachrichtigen?

new Thread(() -> { 
    thread1.run(); 
    thread2.run(); 
    thread3.run(); 
}).start(); 

Dies führt die Aufgaben im Hintergrund, einen nach dem anderen.

+0

Sie laufen aber in zufälliger Reihenfolge. Wie kann man exacly t2 benachrichtigen, um Zugriff auf Daten zu haben, die auch andere Threads benutzen? – iboan

+0

@iboan Ich würde ein Context-Objekt übergeben, das alle Informationen enthält, die jeder Thread benötigt. Dies kann an jeden Thread/jede Aufgabe übergeben werden, damit sie ihre jeweils anderen Daten sehen können. –

Verwandte Themen