} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t2.start();
t1.stop();
}
运行结果:
可以看到,当线程t1在获取到o1和o2两个锁开始执行,在还没有执行结束的时候,主线程调用了t1的stop方法中断了t1的执行,释放了t1线程获取到的所有锁,中断后t2获取到了o1和o2锁,开始执行直到结束,而t1却夭折在了sleep的时候,sleep后的代码没有执行。
因此使用stop我们在不知道线程到底运行到了什么地方,暴力的中断了线程,如果sleep后的代码是资源释放、重要业务逻辑等比较重要的代码的话,亦或是其他线程依赖t1线程的运行结果,那直接中断将可能造成很严重的后果。
那么不建议使用stop中断线程我们应该怎么去优雅的结束一个线程呢,我们可以存java开发者的注释中窥探到一种解决方案:
可以看到java开发者推荐我们使用以下两种方法来优雅的停止线程:
1.定义一个变量,由目标线程去不断的检查变量的状态,当变量达到某个状态时停止线程。
代码举例如下:
volatile static boolean flag=false;
public static void main(String[] args) throws InterruptedException {
Object o1=new Object();
Thread t1=new Thread(()->{
synchronized (o1)
{
try {
System.out.println(“t1获取到锁”);
while (!flag)
Thread.sleep(5000);//执行业务逻辑
System.out.println(“t1结束”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
Thread.sleep(1000);
Thread t2=new Thread(()->{
synchronized (o1)
{
try {
System.out.println(“t2获取到锁”);
Thread.sleep(5000);//执行业务逻辑
System.out.println(“t2结束”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t2.start();
flag=true;
}
运行结果:
2.使用interrupt方法中断线程。
代码举例如下:
public static void main(String[] args) throws InterruptedException {
Object o1=new Object();
Thread t1=new Thread(()->{
synchronized (o1)
{
System.out.println(“t1获取到锁”);
while (!Thread.currentThread().isInterrupted()) {
for (int i = 0; i < 100; i++) {
if(i==50)
System.out.println();
System.out.print(i+" ");
}
System.out.println();
}
System.out.println(“t1结束”);
}
});
t1.start();
Thread t2=new Thread(()->{
synchronized (o1)
{
try {
System.out.println(“t2获取到锁”);
Thread.sleep(5000);//执行业务逻辑
System.out.println(“t2结束”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t2.start();
t1.interrupt();
}
运行结果:
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
本次面试答案,以及收集到的大厂必问面试题分享:
47976543)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-HwJjq03o-1710747976543)]
本次面试答案,以及收集到的大厂必问面试题分享:
[外链图片转存中…(img-adCv4xPQ-1710747976543)]