本文参考自大佬 公众号:路人甲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();
}
}