java 併發編程 線程中斷的幾種方式 interrupt線程標誌

本文參考自大佬 公衆號:路人甲java
添加鏈接描述

通過volatile修飾的變量來停止線程

package juc;

import java.util.concurrent.TimeUnit;

/**
 * @author yanjun.liu
 * @date 2020/6/28--17:13
 */
public class MyInterrupt {

    public volatile static boolean  falg=false;
    public static void setFalg() {
        falg = true;
    }

    public static void main(String[] args) throws Exception {
          new Thread(new Runnable() {
              @Override
              public void run() {
                  while (true){
                        if(falg){
                            break;
                        }
                  }
              }
          }).start();
        TimeUnit.SECONDS.sleep(3);
        setFalg();
    }
}


main函數創建一個線程並啓動,run方法中死循環,單falg=true時跳出循環,
啓動線程後,main線程睡眠三秒,然後設置falg爲true,thread線程run函數會跳出循環,線程結束(volatile保證操作共享變量的可見信)

通過線程自帶的中斷標誌控制

Thread中提供了中斷線程的標誌方法interupt(),和判斷線程中斷標誌的方法isInterrupted()

package juc;

import java.util.concurrent.TimeUnit;

/**
 * @author yanjun.liu
 * @date 2020/6/28--17:44
 */
public class Demo2 {

    public static class T1 extends Thread {
        @Override
        public void run(){
            while (true){
                //可以通過線程的實例方法isInterrupted()獲取線程的中斷標誌。
                //如果爲true,說明設置了中斷,break
                if(this.isInterrupted()){
                    break;
                }
            }
        }
    }

    public static void main(String[] args)throws Exception {
        T1 t1 = new T1();
        t1.start();
        TimeUnit.SECONDS.sleep(3);
        //thread實例對象調用interrupt會將線程的中斷標誌設置爲true,
        t1.interrupt();
    }
}

線程處於阻塞狀態,如何停止線程(兩階段停止)

package juc;

import java.util.concurrent.TimeUnit;

/**
 * @author yanjun.liu
 * @date 2020/6/29--16:00
 */
public class Demo3 {
   public static class T extends Thread{
       @Override
       public void run(){
           while (true){
               //循環業務代碼
               try {
                   //模擬阻塞
                   //當線程處於阻塞狀態時,調用線程的interrupt()實例方法,線程內部會觸發InterruptedException異常,
                   // 並且會清除線程內部的中斷標誌(即將中斷標誌置爲false)
                   TimeUnit.SECONDS.sleep(100);
               }catch (InterruptedException e){
                   e.printStackTrace();
                   //發生異常,在catch中,重新設置線程中斷標誌爲true
                    this.interrupt();
               }
               //通過檢查線程中斷標誌爲true,跳出循環,線程結束
               if(this.isInterrupted()){
                   break;
               }

           }

       }
   }
    public static void main(String[] args)throws InterruptedException {
        T t = new T();
        t.start();
        TimeUnit.SECONDS.sleep(3);
        t.interrupt();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章