Java中怎么实现线程中断

今天就跟大家聊聊有关Java中怎么实现线程中断,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

try{
Thread.sleep(3000);
}catch(InterruptedExceptione){
e.printStackTrace();
}

此时线程被打断后,代码会继续运行或者抛出异常结束运行,这并不是我们需要的中断线程的作用。

到底是什么是线程中断?

线程中断即线程运行过程中被其他线程给打断了,它与 stop 最大的区别是:stop 是由系统强制终止线程,而线程中断则是给目标线程发送一个中断信号,如果目标线程没有接收线程中断的信号并结束线程,线程则不会终止,具体是否退出或者执行其他逻辑由目标线程决定。

我们来看下线程中断最重要的 3 个方法,它们都是来自 Thread 类!

1、java.lang.Thread#interrupt

中断目标线程,给目标线程发一个中断信号,线程被打上中断标记。

2、java.lang.Thread#isInterrupted()

判断目标线程是否被中断,不会清除中断标记。

3、java.lang.Thread#interrupted

判断目标线程是否被中断,会清除中断标记。

线程中断实战

我们来实例演示下线程中断如何用!

示例1(中断失败)

/**
*微信公众号:Java技术栈
*/
privatestaticvoidtest1(){
Threadthread=newThread(()->{
while(true){
Thread.yield();
}
});
thread.start();
thread.interrupt();
}

请问示例1中的线程会被中断吗?答案:不会,因为虽然给线程发出了中断信号,但程序中并没有响应中断信号的逻辑,所以程序不会有任何反应。

示例2:(中断成功)

/**
*微信公众号:Java技术栈
*/
privatestaticvoidtest2(){
Threadthread=newThread(()->{
while(true){
Thread.yield();

//响应中断
if(Thread.currentThread().isInterrupted()){
System.out.println("Java技术栈线程被中断,程序退出。");
return;
}
}
});
thread.start();
thread.interrupt();
}

我们给示例2加上了响应中断的逻辑,程序接收到中断信号打印出信息后返回退出。

示例3(中断失败)

/**
*微信公众号:Java技术栈
*/
privatestaticvoidtest3()throwsInterruptedException{
Threadthread=newThread(()->{
while(true){
//响应中断
if(Thread.currentThread().isInterrupted()){
System.out.println("Java技术栈线程被中断,程序退出。");
return;
}

try{
Thread.sleep(3000);
}catch(InterruptedExceptione){
System.out.println("Java技术栈线程休眠被中断,程序退出。");
}
}
});
thread.start();
Thread.sleep(2000);
thread.interrupt();
}

示例3 sleep() 方法被中断,并输出了 Java技术栈线程休眠被中断,程序退出。 程序继续运行……为什么呢?

来看 sleep 的源码:

Java中怎么实现线程中断

可以看出 sleep() 方法被中断后会清除中断标记,所以循环会继续运行。。

示例4(中断成功)

/**
*微信公众号:Java技术栈
*/
privatestaticvoidtest4()throwsInterruptedException{
Threadthread=newThread(()->{
while(true){
//响应中断
if(Thread.currentThread().isInterrupted()){
System.out.println("Java技术栈线程被中断,程序退出。");
return;
}

try{
Thread.sleep(3000);
}catch(InterruptedExceptione){
System.out.println("Java技术栈线程休眠被中断,程序退出。");
Thread.currentThread().interrupt();
}
}
});
thread.start();
Thread.sleep(2000);
thread.interrupt();
}

看完上述内容,你们对Java中怎么实现线程中断有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注恰卡编程网行业资讯频道,感谢大家的支持。

发布于 2021-06-13 23:19:06
收藏
分享
海报
0 条评论
158
上一篇:Java中怎么扩容ArrayList 下一篇:Java中怎么实现线程的等待与唤醒
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码