java教程(1),最新精心整理Java面试题

本文详细探讨了Java中如何中断线程,包括普通线程中断、耗费时间方法下的中断策略,以及wait/sleep/join方法的中断处理。通过实例演示了中断信号的传递与处理技巧,以及相关技术的实战应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

}

}




仔细看上述代码,`main`线程通过调用`t.interrupt()`方法中断`t`线程,但是要注意,`interrupt()`方法仅仅向`t`线程发出了“中断请求”,至于`t`线程是否能立刻响应,要看具体代码。而`t`线程的`while`循环会检测`isInterrupted()`,所以上述代码能正确响应`interrupt()`请求,使得自身立刻结束运行`run()`方法。



特殊状态下的中断

========



我们上面看到的 中断一个普通线程 其实不过如此:用 interrupt() 发出中断请求,用 isInterrupted() 判断中断状态,根据其状态值做出相应中断操作即可。



下面我们来看一下如果新线程中存在耗费时间的方法,再来执行中断,你看会发生什么情况。其中耗费时间的方法也不多,总共有三种:



1. [Java](

).lang.Object 类的 wait 方法



2\. java.lang.Thread 类的 sleep 方法



3\. java.lang.Thread 类的 join 方法



代码示例如下:



package test;

public class changeData {

public static void main(String[] args) throws InterruptedException {

    //创建线程

    Thread t = new MyThread();

    //必须用 start() 开启一个线程

    t.start();

    //线程中断

    t.interrupt();

}



private static class MyThread extends Thread {

    @Override

    public void run() {

        try {

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

}

}




![](https://img-blog.csdnimg.cn/20210619184139654.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxODg1Njcz,size_16,color_FFFFFF,t_70)



通过上面这个例子我是想说明这么个问题:当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间。



\-- 需要花点时间的方法



执行wait方法的线程,会进入等待区等待被notify/notify All。在等待期间,线程不会活动。



执行sleep方法的线程,会暂停执行参数内所设置的时间。



执行join方法的线程,会等待到指定的线程结束为止。



因此,上面的方法都是需要花点时间的方法。



\-- 可以取消的方法



因为需要花时间的操作会降低程序的响应性,所以可能会取消/中途放弃执行这个方法。



这里主要是通过interrupt方法来取消。



当在sleep中的线程被调用interrupt方法时,就会放弃暂停的状态,并抛出InterruptedException异常,这样一来,线程的控制权就交给了捕捉这个异常的catch块了。



也就是说,新建线程中不存在耗费时间的方法,那就得你自己对线程是否被中断做事判断,然后采取措施。如果存在好费时间的方法(上面列举的三种),那你就捕获InterruptedException异常,然后在里面写逻辑代码就可以了。因为在耗时方法中别人已经帮你封装好了。



我们还是来看一个实例:



package test;

public class changeData {

public static void main(String[] args) throws InterruptedException {

    //创建线程

    Thread t = new MyThread();

    //必须用 start() 开启一个线程

    t.start();

    Thread.sleep(5000);

    //线程中断

    t.interrupt();

}



private static class MyThread extends Thread {

    @Override

    public void run() {

        try {

            while (true){

                Thread.sleep(1000);

                System.out.println("running");

            }

        } catch (InterruptedException e) {

            System.out.println("我被中断了,你可以在这里写中断逻辑");

        }

    }

}

}

Java网盘:pan.baidu.com/s/1MtPP4d9Xy3qb7zrF4N8Qpg
提取码:2p8n

结语

小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。

我们选择的这个行业就一直要持续的学习,又很吃青春饭。

虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](

)**

送给每一位想学习Java小伙伴,用来提升自己。

在这里插入图片描述

我们选择的这个行业就一直要持续的学习,又很吃青春饭。

虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](

)**

送给每一位想学习Java小伙伴,用来提升自己。

[外链图片转存中…(img-DAKmrA5T-1631408630399)]

本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值