Ausführen von Java-Threads sequentiell
Wie werden Sie ausführen, die Drei threads nacheinander? Für zB. Thread1, Thread2 Verzahnt, Thread3. Es ist nicht möglich, übergeben Sie die Referenz von einem Thread zum anderen und aufrufen von run () - Methode.
Also code sollte wie folgt sein:
Thread1.start();
Thread2.start();
Thread3.start();
- und-Ausgang gelegt werden sollte,
Printing Thread1
Printing Thread2
Printing Thread3
Dies ist möglich durch die Verwendung von ThreadPoolExecutor und über eine blockierende Warteschlange aber auch das ist keine akzeptable Antwort.
- schreiben Sie bitte einige details über wenn Sie sind in der Lage, ändern Sie die threads stellen.
- Sie sind frei, um eine Lösung implementieren, aber ich bezweifle, dass er erwartet wurde die übergabe thread verweisen oder mit wait()/notify(). Ich wurde gemacht, um das Gefühl, es war eine offensichtliche Lösung, die ich nicht kannte.
- aber.. In der gleichen Zeit, im Gegenteil, Sie erwarten konnten, dass Sie Ihnen genau die Lösung mit wait()/notify() (oder ein anderes Synchronisations-Mechanismus). Es wird sich zeigen, dass Sie wirklich verstehen, wie Sie zu synchronisieren von threads. In unserer multicore-Zeitalter ist es sehr wichtig, zu verstehen, Synchronisierungsprobleme und solches wissen geschätzt wird, nicht weniger als nur Schlauheit.
- "... auch das ist keine akzeptable Antwort." Warum auf der Erde nicht? Diese Fragen werden immer unverständlicher. Wenn Sie möchten, sequentiality, warum bist du mit threads?
- Reihenfolge drucken von n thread: stackoverflow.com/a/55932508/1216775
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden ExecutorService in java.util.concurrent-Paket. Genauer gesagt verwenden
Executors.newSingleThreadExecutor();
Könnten Sie Vollzieher.newSingleThreadExecutor(), aber streng genommen diese startet nur eine
Thread
, so kann nicht erwartet werden-Lösung.Die einfachste Lösung mit nur
Thread
Klasse:(Ich weggelassen Ausnahmebehandlung für Klarheit,
Thread.join()
werfen kannInterruptedException
)start()
s .run()
Methode synchronisieren Sie irgendwie und ich denke, dieses interview Frage war nicht zu erfahren.start()
- Methode und der benötigten Leistung.Die einfachste Antwort ist
Das problem mit unrealistischen Fragen, haben Sie oft eine sinnlose Antwort. 😉
Den ganzen Sinn des threads ist es, diese gleichzeitig ausgeführt werden. Wenn Sie nicht tun, dass auf allen, nicht mit threads.
Könnte man sagen; Sie kann nicht rufen die run () - Methode, in dem Fall, dass Sie nicht verwenden können, ThreadPoolExecutor denn es ruft die run () - Methode für Sie. also das ist, was die submit() schließlich tut.
EDIT: Die Ergebnisse sind vollständig deterministisch ist, becaus Netz Tatsache, dass es einen Thread beteiligt ist irrelivent.
Drucke
als erwartet.
run
läuft nicht ein neuer thread, es läuft der thread-Logik aus, die dem aufrufenden thread. Vielleicht sind Sie verwirrendrun()
mitstart()
? Sie werden sequenziell ausgeführt, aber es funktioniert nicht führen Sie die drei threads per se also ich bin mir nicht sicher, dass es genau die Frage beantwortet.start()
Methode und übersah Peter schriebrun()
.Da dieses eine interview-Frage, Sie sind auf der Suche nach bestimmten Wissens, nicht ein "naja, es ist natürlich besser, es zu tun auf diese Weise" Antwort. Es scheint auch, dass Sie wahrscheinlich strike out-Lösung nach der Lösung, bis Sie die Antwort bekommen, Sie wollen.
Chancen sind Sie wollen, um zu sehen, ob Sie implementieren können, um inter-thread-Kommunikation selbst. Aber Sie wollen nicht Sie, tun Sie es der einfache Weg (thread Referenzen). Ansonsten könnte man nur tun
thread.join()
.So haben alle drei threads greifen einige bit-shared-memory (synchronized static class). Haben jeden thread überprüfen eine
public static int nextThread()
. Nach erfolgreicher Vergleich, dass Sie den nächsten thread, Sie sollten Ihre Arbeit tun und updatepublic static setNextThread(int value)
mit dem Wert des nächsten thread verarbeitet werden.Der Schlüssel ist, dies in einem thread-sichere Weise; jedoch, wenn Sie garantieren können einzigartige thread-IDS und sicherstellen, dass keine zwei threads haben den gleichen Bezeichner haben, können Sie (bei sorgfältiger Codierung) selbst zu verwalten, dies zu tun, ohne die Synchronisierung.
Wenn es nicht im Zusammenhang mit verschiedenen Möglichkeiten der Berufung auf diese threads, theoretisch sollten Sie erwerben eine gemeinsame sempahore, und lassen Sie es, wenn Sie fertig drucken.
JDK hat eine eingebauten semaphore.
Threads ausgeführt werden kann sequenziell durch die Verwendung von ExecutorService. Unten finden Sie Beispiel.
Zwingt threads ausgeführt werden in einer geordneten Art und Weise ist, wie das töten das Konzept der
multithreading, eher wie die single-threaded-Programm' sub-routine Ausführung. Als seine interview-Frage, so ist alles OK. Hier ist das Programm, das testen der Logik nicht mit 4 sondern 50 threads-
Finden Sie alles, was es gibt: http://download.oracle.com/javase/tutorial/essential/concurrency/index.html
Vor allem Lesen Sie über Benachrichtigungen und Synchronisation zwischen threads.
P. S. Und denken Sie daran, auch wenn Sie das interview werden Sie noch arbeiten musste! 🙂
(Ok, ich gebe ein paar Hinweise: sehen Sie die Beschreibung der Methoden wie
Object.wait()
undObject.notifyAll()
es ist die einfachste, aber auch sehr nützliche Mechanismus)obj1
bevor Thread 2 wartet aufobj1
. Sie müssen auch eine Flagge und eine Schleife, die für jede Sperre, die wissen, Wann Sie geweckt, die über spurious wakeup oder legitimitely. Verwenden Sie eine bereitgestellte Parallelität Mechanismus wie einjava.util.concurrent.CountDownLatch
behebt beide Probleme.newSingleThreadExecutor. Eine single-threaded-Testamentsvollstrecker erstellt ein worker thread zu Prozess-tasks, ersetzen Sie es, wenn es stirbt unerwartet. Aufgaben sind garantiert verarbeitet werden sequentiell gemäß der Reihenfolge, die von der task queue (FIFO, LIFO, priority bestellen).
Dies könnte eine Fangfrage. Vielleicht wollen Sie nicht zu hören, die Lösung für dieses spezielle problem, aber wollen Sie zurück zu verfolgen, um die Quelle des Problems und kommen mit einer besseren Lösung.
Ich habe grundlegende thread-Kommunikations-Modell, und es könnte mehr vereinfacht als gut. Sagen wir mal du hast 3 threads, einer ist der Druck 0, die zweite druckt ungerade Zahl ist, und die Dritte ist das drucken sogar die Anzahl liker diese
01 02 03 04 05....
Ich bin nicht sicher, ob ich verstanden habe die Frage komplett, aber es scheint eine situation, in der wir drucken möchten, werden die threads in der Reihenfolge. Ein Beispiel ist der Druck, den Wert, die Verwendung von threads in einer Sequenz wie:
Wenn dies der Anforderung eine generische Lösung für n threads geschrieben werden kann, wo jeder thread wartet, bis Ihr dran (mit gemeinsamen Objekt, auf das er wird versuchen, die Sperre).
Nun ein worker-thread wird seinen job tun, und verwenden Sie die Instanz der obigen Klasse für die Verriegelung Zweck:
Und dies kann getestet werden, wie: