多线程系列文章目录
💥 💥 💥如果你觉得我的文章有帮助到你,还请【关注➕点赞➕收藏】,得到你们支持就是我最大的动力!!!
💥 💥 💥
⚡版权声明:本文由【马上回来了】原创、在优快云首发、需要转载请联系博主。
版权声明:本文为优快云博主「马上回来了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
🚀🚀🚀 新的知识开始喽🚀🚀🚀
1.线程中断
在创建一个了线程对象后,调用start方法时,会在操作系统内核里正真创建一个线程(PCB),此时,会执行程序员重写的run方法里的任务,当run方法执行完之后线程也就销毁了。
而线程中断本质上就是让run方法尽快结束,而不是run方法执行到一半强制结束,而如何中断线程就取决于run方法里的实现逻辑。
2.自定义标志位中断线程
先看一段线程死循环不结束的代码:
public static void main(String[] args) {
Thread t = new Thread(){
@Override
public void run() {
while (true){//这里永真,死循环,t线程一直在执行
}
}
};
t.start();
}
运行结果:
自定义标志位将while循环进行终止:
public volatile static boolean Q = false;//定义一个全局的静态变量,用volatile修饰防止Q修改太慢导致的出现内存可见性问题
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(){
@Override
public void run() {
while(!Q){//!Q为true,在未修改Q之前while将会一直循环
}
System.out.println("t线程结束");
}
};
t.start();//启动线程
System.out.println("t线程执行2s后结束");
Thread.sleep(2000);//main线程先休眠2s在修改Q为true终止循环
Q = true;
}
运行结果:
3.使用标准库里提供的interrupt方法
1.线程不在休眠的状态下,即run方法里没有sleep函数:
public static void main(String[] args) {
Thread t = new Thread(){
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()){
}
System.out.println("t线程结束");
}
};
t.start();
t.interrupt();//while循环里的结果变为false,run执行完打印函数后线程结束
}
2.线程在休眠的状态下:
2.1 如果catch里不加break,则线程不会中断,只会打印日志
public static void main(String[] args) {
Thread t = new Thread(){
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()){
System.out.println("t线程在执行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("t线程结束");
}
};
t.start();
System.out.println("设置让t线程结束");
t.interrupt();
}
运行结果:
2.2 catch里加break可中断线程:
触发异常后立即中断线程:
public static void main(String[] args) {
Thread t = new Thread(){
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()){
System.out.println("t线程在执行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
break;//这里直接break,会立即中断线程
}
}
System.out.println("t线程结束");
}
};
t.start();
System.out.println("设置让t线程结束");
t.interrupt();
}
运行结果:
触发异常后,休眠一会儿在中断线程:
public static void main(String[] args) {
Thread t = new Thread(){
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()){
System.out.println("t线程在执行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
ex.printStackTrace();//这里会在触发异常五秒后在中断线程
}
break;
}
}
System.out.println("t线程结束");
}
};
t.start();
System.out.println("设置让t线程结束");
t.interrupt();
}
🌏🌏🌏今天的你看懂这里又学到了很多东西吧🌏🌏🌏
🌔 🌔 🌔下次见喽🌔 🌔 🌔