Anmutig Herunterfahren ein Programm mit mehreren threads mit unendlichen while-Schleife
Ich habe ein Programm erstellt 10 threads, und jeder thread hat eine endlos laufende while-Schleife.
Ich brauche Hilfe, um effizient zu implementieren, ein Shutdown-hook, mit dem wirksam BEENDEN aller threads. Da will ich tun, um ein ordnungsgemäßes Herunterfahren jeder Thread beendet werden soll, sobald er feststellt das stop-flag gesetzt hat, zu WAHREN.
public class SampleGSH implements Runnable{
private static boolean stop = false;
public static void main(String[] args) {
for(int i = 0; i < 10;i++) {
Thread t = new Thread(new SampleGSH(), "name"+i);
t.start();
}
}
@Override
public void run() {
Runtime.getRuntime().addShutdownHook(new Thread("shutdown thread") {
public void run()
{
System.out.println("*******");
synchronized (this)
{
System.out.println("Turning switch off");
stop = true;
}
}
});
synchronized (this) {
while(!stop)
{
//Some logic which should not be killed abruptly once it starts running, a graceful shut down will not allow this code to start
}
}
}
}
Jede Hilfe wird wirklich geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine FAQ. Wenn Sie alle Felder, die von mehreren threads gemeinsam genutzt, müssen Sie synchronisiert werden. In diesem Fall ist Ihr
stop
solltevolatile
. Ohne diese, gibt es nichts, das dafür sorgt, dass die threads sehen den Wert vonstop
änderungtrue
. Sehen dieses tutorial für Informationen über Atomare Zugriff.Finden Sie unter: Boolesche var für das stoppen von threads
Paar andere Kommentare:
ExecutorService
while
loop ist innen aus einemsynchronized
block. Dieses tut nichts mehr, und diestop
Feld nicht get-Speicher synchronisiert, da es aktualisiert wird außen, während im inneren des Blocks.Einen anderen Weg zu stoppen, wäre ein thread zu
interrupt()
es. Sehen dieses tutorial.Vergessen, dass
addShutdownHook
guff ... keep it simple ...Machen die statischen
stop
variable flüchtigen ...dann fügen Sie diese Methode, um SampleGSH ...
public void shutdown() {
stop = true;
}
dann nennen, wenn Sie wollen, zu stoppen der threads!
Statt einer einzigen static boolean stop, Sie geben jedem thread eine eigene Haltestelle boolean. Speichern Sie dann alle thread-Objekte erstellen, wenn Sie Sie und setzen Sie Ihre stop-boolean true in der shutdown-hook-thread (das würde süchtig werden in der main-Methode).
Etwas wie dieses: