一 正常結束。
package com.aaa.threaddemo; /* 一 終止線程的四種方式? * 程序運行結束,線程終止。 * */ public class ThreadTermination { public static void main(String[] args) { // 正常方式 把線程放入到thread中, 調用start方法。 Thread thread = new Thread(new Runnable() { public void run() { System.out.println(111); } }); thread.start(); } }
二 使用退出標志
package com.aaa.threaddemo; /* 一 終止線程的四種方式? * 程序運行結束,線程終止。 * * 使用退出標志,退出線程 * 正常而言,線程執行完run方法,就會結束。但是有些線程是服務線程,需要長時間運行。 * 可以在外部設置一個條件,滿足條件時才關閉線程。 */ public class ThreadTermination { public static void main(String[] args) throws InterruptedException { ThreadIf thread = new ThreadIf(); thread.start(); // 休息一會 thread.sleep(2000); // 改變條件狀態 thread.exit = true; System.out.println("線程結束"); } } class ThreadIf extends Thread{ //volatile 關鍵字使exit同步,同一時刻,只有一個線程來修改exit。 volatile boolean exit = false; @Override public void run() { // 條件是true 一直執行 while (!exit) { System.out.println(Thread.currentThread().getName()); } } }
3 interrupt 方法
package com.aaa.threaddemo; /* 一 終止線程的四種方式? * 1.程序運行結束,線程終止。 * * 2.使用退出標志,退出線程。自定義條件。 * 正常而言,線程執行完run方法,就會結束。但是有些線程是服務線程,需要長時間運行。 * 可以在外部設置一個條件,滿足條件時才關閉線程。 * * 3.interrupt方法來中斷線程,可以分為兩種情況 * a 線程處於阻塞狀態: 當線程使用了sleep wait socket中的receiver ,accept等方法時。 * 此時調用線程的interrupt方法,會拋出interruptException。 * 阻塞中的方法拋出異常,通過代碼捕獲,然后break跳出循環狀態,才能正常結束run方法。 * * b 線程是未阻塞狀態, 使用isinterrupt 方法判斷線程的中斷標志來退出循環。 * 使用interrupt方法,會把中斷標志設置為true。 * 和使用自定義標志來控制循環是一樣的。 * * 什么是中斷? * Java中用於停止線程的機制------中斷。 * 中斷是一種協作機制,中斷的過程需要程序員自己實現。調用interrupt方法也只是將標示設置為true。 * 每個線程對象中都有一個標識,用於表示線程是否被中斷;該標識位為true表示中斷,為false表示未中斷; * 通過調用線程對象的interrupt方法將該線程的標識位設為true;可以在別的線程中調用,也可以在自己的線程中調用。 * * 為什么使用中斷? * 在可能會發生的中斷線程中,一直監聽中斷的狀態,一旦發生了中斷,就執行相關代碼,進行處理。 * while(thread.isInterrupted()){ //沒有中斷,繼續執行 * xxxxxx * } * * // 發生中斷了 需要的處理 * System.out.println("發生了中斷,請處理。。。"); * */ public class ThreadTermination { public static void main(String[] args) throws InterruptedException { ThreadIf thread = new ThreadIf(); //isInterrupted 判斷調用者線程的中斷標志 false or true ,驗證狀態。 if (thread.isInterrupted()) { System.out.println("當前的狀態是false,不會輸出本條語句"); } thread.start(); /* 把中斷的標志 設置為true ,通知線程應該中斷了。 此時線程是非阻塞狀態,將會正常執行,不受影響。 */ thread.interrupt(); //再次驗證,此時已經中斷 條件是true 可以輸出語句。 使用while 就可以一直執行,和使用自定義的條件,是一樣的效果。 if (thread.isInterrupted()) { System.out.println("isInterrupted 判斷調用者線程的中斷標志 false or true ,驗證狀態。 標識是true,輸出本條語句"); } //interrupted 方法有兩個作用。會返回當前的中斷狀態,並且清除中斷狀態。 會把true,變為false boolean b = thread.interrupted(); if (!b) { System.out.println("interrupted() 會返回當前的中斷狀態,並且清除中斷狀態。 會把true,變為false "); } } } class ThreadIf extends Thread{ @Override public void run() { System.out.println(Thread.currentThread().getName()); } }
四 stop
package com.aaa.threaddemo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /* 一 終止線程的四種方式? * 1.程序運行結束,線程終止。 * * 2.使用退出標志,退出線程。自定義條件。 * 正常而言,線程執行完run方法,就會結束。但是有些線程是服務線程,需要長時間運行。 * 可以在外部設置一個條件,滿足條件時才關閉線程。 * * 3.interrupt方法來中斷線程,可以分為兩種情況 * a 線程處於阻塞狀態: 當線程使用了sleep wait socket中的receiver ,accept等方法時。 * 此時調用線程的interrupt方法,會拋出interruptException。 * 阻塞中的方法拋出異常,通過代碼捕獲,然后break跳出循環狀態,才能正常結束run方法。 * * b 線程是未阻塞狀態, 使用isinterrupt 方法判斷線程的中斷標志來退出循環。 * 使用interrupt方法,會把中斷標志設置為true。 * 和使用自定義標志來控制循環是一樣的。 * * 什么是中斷? * Java中用於停止線程的機制------中斷。 * 中斷是一種協作機制,中斷的過程需要程序員自己實現。調用interrupt方法也只是將標示設置為true。 * 每個線程對象中都有一個標識,用於表示線程是否被中斷;該標識位為true表示中斷,為false表示未中斷; * 通過調用線程對象的interrupt方法將該線程的標識位設為true;可以在別的線程中調用,也可以在自己的線程中調用。 * * 為什么使用中斷? * 在可能會發生的中斷線程中,一直監聽中斷的狀態,一旦發生了中斷,就執行相關代碼,進行處理。 * while(thread.isInterrupted()){ //沒有中斷,繼續執行 * xxxxxx * } * * // 發生中斷了 需要的處理 * System.out.println("發生了中斷,請處理。。。"); * * 4 stop 暴力終止線程。 釋放鎖,容易造成數據的不一致。 * 直接將線程強行終止,已經是過期作廢的方法。這個方法是不安全的,不推薦使用。 * * 不安全的原因? * 調用stop 方法后,創建子線程的線程會拋出錯誤,會把子線程的所有鎖釋放, * 一般任何進行加鎖的代碼快,都是為了保證數據的一致性。 * 如果使用stop方法導致,子線程釋放了所有鎖,被保護的數據就會不一致。 * */