線程終止的四種方式,interrupt 方法使用的簡單介紹。


一 正常結束。

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方法導致,子線程釋放了所有鎖,被保護的數據就會不一致。
 * 
 */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM