iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java高并发InterruptedException异常引发思考
  • 430
分享到

java高并发InterruptedException异常引发思考

2024-04-02 19:04:59 430人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录前言程序案例问题分析问题解决总结前言 InterruptedException异常可能没你想的那么简单! 当我们在调用Java对象的wait()方法或者线程的sleep()方法时

前言

InterruptedException异常可能没你想的那么简单!

当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常。如果我们对InterruptedException异常处理不当,则会发生我们意想不到的后果!

程序案例

例如,下面的程序代码,InterruptedTask类实现了Runnable接口,在run()方法中,获取当前线程的句柄,并在while(true)循环中,通过isInterrupted()方法来检测当前线程是否被中断,如果当前线程被中断就退出while(true)循环,同时,在while(true)循环中,还有一行Thread.sleep(100)代码,并捕获了InterruptedException异常。

整个代码如下所示。

package io.binghe.concurrent.lab08;

public class InterruptedTask implements Runnable{
    @Override
    public void run() {
        Thread currentThread = Thread.currentThread();
        while (true){
            if(currentThread.isInterrupted()){
                break;
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

上述代码的本意是通过isInterrupted()方法检查线程是否被中断了,如果中断了就退出while循环。其他线程通过调用执行线程的interrupt()方法来中断执行线程,此时会设置执行线程的中断标志位,从而使currentThread.isInterrupted()返回true,这样就能够退出while循环。

这看上去没啥问题啊!但真的是这样吗?我们创建一个InterruptedTest类用于测试,代码如下所示。

package io.binghe.concurrent.lab08;

public class InterruptedTest {
    public static void main(String[] args){
        InterruptedTask interruptedTask = new InterruptedTask();
        Thread interruptedThread = new Thread(interruptedTask);
        interruptedThread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        interruptedThread.interrupt();
    }
}

我们运行main方法,如下所示。

这竟然跟我们想象的不一样!不一样!不一样!这是为什么呢?

问题分析

上述代码明明调用了线程的interrupt()方法来中断线程,但是却并没有起到啥作用。原因是线程的run()方法在执行的时候,大部分时间都是阻塞在sleep(100)上,当其他线程通过调用执行线程的interrupt()方法来中断执行线程时,大概率的会触发InterruptedException异常,在触发InterruptedException异常的同时,JVM会同时把线程的中断标志位清除,所以,这个时候在run()方法中判断的currentThread.isInterrupted()会返回false,也就不会退出当前while循环了。

既然问题分析清除了,那如何中断线程并退出程序呢?

问题解决

正确的处理方式应该是在InterruptedTask类中的run()方法中的while(true)循环中捕获异常之后重新设置中断标志位,所以,正确的InterruptedTask类的代码如下所示。

package io.binghe.concurrent.lab08;

public class InterruptedTask implements Runnable{
    @Override
    public void run() {
        Thread currentThread = Thread.currentThread();
        while (true){
            if(currentThread.isInterrupted()){
                break;
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
                currentThread.interrupt();
            }
        }
    }
}

可以看到,我们在捕获InterruptedException异常的catch代码块中新增了一行代码。

currentThread.interrupt();

这就使得我们捕获到InterruptedException异常后,能够重新设置线程的中断标志位,从而中断当前执行的线程。

我们再次运行InterruptedTest类的main方法,如下所示。

总结

处理InterruptedException异常时要小心,如果在调用执行线程的interrupt()方法中断执行线程时,抛出了InterruptedException异常,则在触发InterruptedException异常的同时,JVM会同时把执行线程的中断标志位清除,此时调用执行线程的isInterrupted()方法时,会返回false。

此时,正确的处理方式是在执行线程的run()方法中捕获到InterruptedException异常,并重新设置中断标志位(也就是在捕获InterruptedException异常的catch代码块中,重新调用当前线程的interrupt()方法)。

写在最后

最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。

以上就是java高并发InterruptedException异常引发思考的详细内容,更多关于java高并发InterruptedException异常的资料请关注编程网其它相关文章!

--结束END--

本文标题: java高并发InterruptedException异常引发思考

本文链接: https://www.lsjlt.com/news/166382.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java高并发InterruptedException异常引发思考
    目录前言程序案例问题分析问题解决总结前言 InterruptedException异常可能没你想的那么简单! 当我们在调用Java对象的wait()方法或者线程的sleep()方法时...
    99+
    2024-04-02
  • 对python并发编程的思考
    为了提高系统密集型运算的效率,我们常常会使用到多个进程或者是多个线程,python中的Threading包实现了线程,multiprocessing 包则实现了多进程。而在3.2版本的python中,将进程与线程进一步封装成concurr...
    99+
    2023-01-31
    python
  • java == 引发的线上异常详解
    今天分享遇到的一个线上的 bug,线上代码: class Scratch { public static void main(String[] args) { ...
    99+
    2024-04-02
  • java异常引发的原因有哪些
    Java异常引发的原因主要有以下几种: 代码错误:程序中存在语法错误、逻辑错误或者算法错误,导致程序无法正常执行,从而引发异常。...
    99+
    2023-10-20
    java
  • java高并发的并发级别详解
    目录阻塞无饥饿(Starvation-Free)无障碍(Obstruction-Free)无锁(Lock-Free)等待总结阻塞、无饥饿、无障碍、无锁、无等待几种。 阻塞 一个线程是...
    99+
    2024-04-02
  • rollup打包引发对JS模块循环引用思考
    目录引言背景1背景2commonjses modules总结引言 最近在项目中使用了typescript + rollup,满心欢喜测试打包结果的时候,发现打包出来的文件竟然无法运行...
    99+
    2024-04-02
  • java高并发处理 java处理高并发的几种方法
    一、背景综述         并发就是可以使用多个线程或进程,同时处理(就是并发)不同的操作。         高并发的时候就是有很多用户在访问,导致系统数据不正确、糗事数据的现象。对于一些大型网站,比如门户网站,在面对大量用户访问、高并发...
    99+
    2023-09-22
    java
  • 详解Java异常处理的使用与思考
    目录概念异常处理自定义异常多重捕获重新抛出异常更好的 NPE清道夫:finally异常的约束try-with-resources异常类型匹配使用指南检查型异常是 shitGo 也没有...
    99+
    2023-05-15
    Java异常处理使用 Java异常处理 Java异常
  • 基于Log4j2阻塞业务线程引发的思考
    目录问题描述问题1问题2:异常线程栈打印使用讨论ThrowableProxy使用错误的CCL原因分析异步Appender追加日志创建log4j日志事件创建ThrownProxy代理为...
    99+
    2024-04-02
  • java高并发中并发级别的示例分析
    这篇文章给大家分享的是有关java高并发中并发级别的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。阻塞一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。当我们使用synchronized...
    99+
    2023-06-25
  • python链家网高并发异步爬虫and异
    python链家网二手房异步IO爬虫,使用asyncio、aiohttp和aiomysql 很多小伙伴初学python时都会学习到爬虫,刚入门时会使用requests、urllib这些同步的库进行单线程爬虫,速度是比较慢的,后学会用scr...
    99+
    2023-01-31
    爬虫 链家 python
  • Java和Django:索引和并发的差异和相似之处
    随着互联网的发展,越来越多的企业开始使用Web应用程序作为其业务核心。Java和Django是两种广泛应用于Web开发的编程语言。本文将分析Java和Django在索引和并发方面的差异和相似之处。 索引 索引是数据库管理系统中用于提高数据...
    99+
    2023-11-01
    索引 django 并发
  • java怎么处理高并发
    在处理高并发时,可以使用以下几种方法来提高Java应用程序的性能和并发处理能力:1. 使用线程池:通过使用线程池可以减少线程的创建和...
    99+
    2023-08-23
    java
  • Java高并发处理方案
    java高并发,如何解决,什么方式解决 一,什么是高并发? 二,高并发解决思路? 三,高并发解决方案 一、什么是高并发 1.1 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,...
    99+
    2023-09-30
    java jvm 开发语言 Powered by 金山文档
  • java怎么实现高并发
    Java可以通过以下几种方法来实现高并发:1. 线程池:使用线程池来管理线程,避免频繁创建和销毁线程,提高线程的重用性和效率。2. ...
    99+
    2023-08-12
    java
  • Java 并发集合实战指南:轻松开发高并发系统
    一、Java 并发集合简介 Java 并发集合是 Java Collections Framework 的一部分,专为多线程编程而设计。它们提供了一系列线程安全的集合类,可用于存储和管理共享数据。Java 并发集合的主要优点包括: ...
    99+
    2024-02-07
    Java 并发集合 并发编程 高并发系统 线程安全 效率
  • Java和Unix并发开发:如何提高开发效率?
    随着科技的发展,计算机的处理能力越来越强,多核CPU的普及也让并发编程变得越来越重要。Java和Unix都是现代并发编程的重要工具,如何利用它们提高开发效率呢?本文将为您详细介绍。 一、Java并发编程 Java作为一门面向对象的编程语言...
    99+
    2023-09-11
    unix 并发 开发技术
  • MongoDB一次节点宕机引发的思考是怎样的
    本篇文章为大家展示了MongoDB一次节点宕机引发的思考是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。简介最近一个 MongoDB 集群环境中的某节点异常下...
    99+
    2024-04-02
  • 关于vuex更新视图引发的一些思考详析
    目录场景解决总结扩展vuex可以集中式存储管理应用的所有组件的状态,当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高...
    99+
    2024-04-02
  • java高并发高可用怎么实现
    要实现高并发和高可用的Java系统,可以采取以下几个步骤:1. 水平扩展:通过增加服务器数量来分担负载,可以使用负载均衡器来将请求分...
    99+
    2023-10-20
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作