Verwenden Sie Thread.interrupt(), um einen Thread zu unterbrechen
Wie in Listing A beschrieben, unterbricht die Thread.interrupt()-Methode einen laufenden Thread nicht. Was diese Methode tatsächlich erreicht, besteht darin, ein Interrupt-Signal auszulösen, wenn der Thread blockiert ist, sodass der Thread den blockierten Zustand verlassen kann. Genauer gesagt: Wenn der Thread durch eine der drei Methoden Object.wait, Thread.join und Thread.sleep blockiert wird, erhält er eine Interrupt-Ausnahme (InterruptedException) und beendet so den blockierten Zustand vorzeitig.
Wenn der Thread daher durch die oben genannten Methoden blockiert wird, besteht die richtige Methode zum Stoppen des Threads darin, die gemeinsam genutzte Variable festzulegen und interrupt() aufzurufen (beachten Sie, dass die Variable zuerst festgelegt werden sollte). Wenn der Thread nicht blockiert ist, hat der Aufruf von interrupt() keine Auswirkung; andernfalls erhält der Thread eine Ausnahme (der Thread muss im Voraus auf die Bewältigung dieser Situation vorbereitet sein) und verlässt dann den blockierten Zustand. In beiden Fällen überprüft der Thread schließlich die gemeinsam genutzte Variable und stoppt dann. Listing C ist ein Beispiel, das diese Technik beschreibt.
Listing C class Example3 extends Thread { volatile boolean stop = false; public static void main( String args[] ) throws Exception { Example3 thread = new Example3(); System.out.println( "Starting thread..." ); thread.start(); Thread.sleep( 3000 ); System.out.println( "Asking thread to stop..." ); thread.stop = true;//如果线程阻塞,将不会检查此变量 thread.interrupt(); Thread.sleep( 3000 ); System.out.println( "Stopping application..." ); //System.exit( 0 ); } public void run() { while ( !stop ) { System.out.println( "Thread running..." ); try { Thread.sleep( 1000 ); } catch ( InterruptedException e ) { System.out.println( "Thread interrupted..." ); } } System.out.println( "Thread exiting under request..." ); } }
Sobald Thread.interrupt() in Listing C aufgerufen wird, empfängt der Thread eine Ausnahme, entkommt dem blockierten Zustand und bestimmt, dass er anhalten soll. Wenn Sie den obigen Code ausführen, erhalten Sie die folgende Ausgabe:
Starting thread... Thread running... Thread running... Thread running... Asking thread to stop... Thread interrupted... Thread exiting under request... Stopping application...
Das Obige ist der Inhalt zum Unterbrechen eines laufenden Threads (2) in Java. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn) !