本文參考自大佬 公衆號:路人甲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();
}
}