`
iwindyforest
  • 浏览: 234747 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java正确处理InterruptedException的方法

 
阅读更多

要想讨论正确处理InterrupedtException的方法,就要知道InterruptedException是什么。

根据Java Doc的定义

Thrown when a thread is waiting, sleeping, or otherwise occupied, and the thread is interrupted, either before or during the activity. Occasionally a method may wish to test whether the current thread has been interrupted, and if so, to immediately throw this exception.
意思是说当一个线程处于等待,睡眠,或者占用,也就是说阻塞状态,而这时线程被中断就会抛出这类错误。Java6之后结束某个线程A的方法是 A.interrupt()。如果这个线程正处于非阻塞状态,比如说线程正在执行某些代码的时候,不过被interrupt,那么该线程的 interrupt变量会被置为true,告诉别人说这个线程被中断了(只是一个标志位,这个变量本身并不影响线程的中断与否),而且线程会被中断,这时 不会有interruptedException。但如果这时线程被阻塞了,比如说正在睡眠,那么就会抛出这个错误。请注意,这个时候变量 interrupt没有被置为true,而且也没有人来中断这个线程。比如如下的代码:

 

while(true){
    try {
     Thread.sleep(1000);
    }catch(InterruptedException ex)
    {
          logger.error("thread interrupted",ex);
    } 
}

 

 

当线程执行sleep(1000)之后会被立即阻塞,如果在阻塞时外面调用interrupt来中断这个线程,那么就会执行

 

logger.error("thread interrupted",ex);

 

 

这个时候其实线程并未中断,执行完这条语句之后线程会继续执行while循环,开始sleep,所以说如果没有对InterruptedException进行处理,后果就是线程可能无法中断

所以,在任何时候碰到InterruptedException,都要手动把自己这个线程中断。由于这个时候已经处于非阻塞状态,所以可以正常中断,最正确的代码如下

 

while(!Thread.isInterrupted()){
    try {
     Thread.sleep(1000);
    }catch(InterruptedException ex)
    {
          Thread.interrupt()
    } 
}

 

 

 

这样可以保证线程一定能够被及时中断。

对于更为复杂的情况,除了要把自己的线程中断之外,还有可能需要抛出InterruptedException给上一层代码

 

 

分享到:
评论

相关推荐

    Java处理InterruptedException异常的理论与实践

    总的来说,理解并正确处理`InterruptedException`是编写健壮、响应性强的Java并发程序的关键。当你的代码调用了可能会抛出`InterruptedException`的方法时,应该考虑你的方法是否也需要处理中断,以便于实现可取消的...

    处理 InterruptedException1

    在 Java 语言中,有很多方法可以抛出 InterruptedException,例如 Thread.sleep() 和 Object.wait()。这些方法都是阻塞方法,它们的完成取决于外部事件,而不是简单地运行完成任务。InterruptedException 是一种检查...

    JAVA InterruptedException

    总之,理解和正确处理`InterruptedException`是Java多线程编程中的关键技能,它涉及到线程的协作和资源管理,对于编写健壮的并发程序至关重要。在实际开发中,应根据具体情况选择合适的中断处理策略,确保程序的稳定...

    JAVA多线程操作方法实用大全

    `sleep()`方法会抛出`InterruptedException`,因此在使用时需要进行异常处理。以下是一个简单的例子: ```java try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } ``` `...

    java异常处理

    Java异常处理是编程中至关重要的一个环节,它用于管理和处理程序执行过程中可能出现的错误和异常情况。Java提供了丰富的异常类来表示不同类型的错误,这些异常类位于`java.lang`包和其他相关包中。异常处理机制使得...

    InterruptedException和interrup

    理解并正确处理这个异常对于编写高效的并发代码至关重要。 首先,我们来讨论一下线程的中断。在Java中,每个线程都有一个中断标志,可以通过`Thread.interrupt()`方法设置。这个方法不仅会设置中断标志,还会在当前...

    [bugfix]重新理解Thread的InterruptedException

    总之,理解和正确处理`InterruptedException`是Java多线程编程中不可或缺的一部分。它允许程序优雅地响应中断请求,同时维护了线程中断的语义,这对于编写可扩展、可维护的并发应用至关重要。通过深入学习和实践,...

    java 多线程异常处理

    Java多线程异常处理是Java编程中不可或缺的一部分,特别是在并发编程场景下,正确处理异常能够保证程序的稳定性和健壮性。本实验报告主要涵盖了Java异常处理机制、多线程概念与实现,以及多线程同步问题。 首先,...

    java中断线程的正确姿势完整示例.rar

    3. **捕获并处理InterruptedException**:对于那些会抛出`InterruptedException`的方法,我们通常需要在`try-catch`块中捕获它。捕获后,可以清除中断标志(因为这些方法会自动清除),然后根据需要处理中断情况,...

    Java线程超时监控

    另外,`java.lang.Thread`类也提供了一种实现线程超时的方法,通过使用`join`方法。`join`可以等待某个线程结束,同时可以设置一个等待时限。 ```java Thread thread = new Thread(() -> { // 需要监控的线程代码 ...

    java并发编程分享

    在并发编程中,正确处理InterruptedException是至关重要的。 以上就是Java并发编程的一些核心知识点。在实际开发中,熟练掌握这些概念和技巧,可以编写出高效、稳定的并发程序,提升系统的整体性能。在不断学习和...

    javaThread正确的示例.rar

    - **线程中断**:调用Thread对象的interrupt()方法,标记线程为中断状态,run()方法可以捕获InterruptedException。 - **线程礼让**:调用Thread.yield()方法,让当前线程暂停,让其他线程有机会运行。 - **线程....

    windows的64位操作系统下的java的jdk17安装包

    7. **验证安装**: 安装成功后,可以通过在命令行输入`java -version`和`javac -version`来检查Java运行时和编译器的版本,确保JDK已经正确安装并配置。 8. **开发与运行**: 开发者可以使用IDE(如IntelliJ IDEA或...

    java线程的操作方法

    Java通过线程实现了程序中的并行处理,使得多个任务可以在同一程序中同时运行。本篇将深入探讨Java线程的操作方法,帮助你理解和掌握这一关键知识点。 1. **线程的创建** - **继承Thread类**:创建一个新的类,该...

    3-JAVA高级部分--含解析.docx

    本文将深入探讨Java的高级特性,包括多线程、网络编程、IO流和异常处理。 1. **包(Package)与导入(Import)**:在Java程序中,正确的顺序是先定义包(package),然后导入需要的类或包(import),最后定义类...

    Java调用本地的远程桌面连接

    文件名`xinhui-mstsc-test`可能是一个测试项目的名称,用于验证上述方法的正确性和效果。在这个测试项目中,你可以编写单元测试或者集成测试,模拟不同的网络环境和登录场景,确保代码的稳定性和可靠性。 总之,...

    Sun SCJP JAVA经典认证电子书-JAVA Cram Bible Sun Certified Programmer for the Java 2 Platform

    这是Java事件处理模型中的一个特点。 - **选项C**: “事件的原始副本会被传递给监听器方法。”——错误。监听器方法接收到的是事件对象本身,而不是其副本。 - **选项D**: “如果多个监听器被添加到同一个组件上,...

    java线性编程方面

    例如,调用wait()、sleep()和notify()方法时,都要处理InterruptedException异常。 这些知识点是Java线程编程的基础,它们构成了Java并发编程的骨架,帮助开发者编写出稳定和高效的多线程应用程序。在实际开发中,...

Global site tag (gtag.js) - Google Analytics