`
为了明天
  • 浏览: 114587 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

InterruptedException的解读

阅读更多
最近写了些多线程的程序,用Thread.sleep()的时候有时会碰到InterruptedException。查了一些资料,下面是我自己的一些理解。

阻塞方法
一些多线程相关的方法是阻塞方法,比如Thread.sleep(), Thread.wait(), Thread.join()。

这些方法的执行通常需要比较长的时间来完成,当代码执行到阻塞方法时,一般要等待该方法返回后

才能继续往下执行,而InterruptedException提供了一种特殊的机制提前结束阻塞方法。

中断变量
每个线程都会维护一个bool变量,表示线程处于中断(true)或者非中断状态(false)。在线程初始的情况下中断变量为false。

这个变量的bool值可以通过Thread.isInterrupted()方法来读取,通过Thread.interrupted()方法来清除中断(即将中断变量置为false)。

线程中断
一个线程可以通过调用Thread.interrupt()方法来中断另外一个线程,具体过程如下:

1. 中断变量被设置为true。

2. 如果线程执行到了阻塞方法,那么该方法取消阻塞,并将中断变量重新置为false。
(这种机制是通过阻塞方法内部不断轮询中断变量的值来实现的)

例子:

class ThreadTest implements Runnable {
 
     @Override
     public void run() {
                 System.out.println("before sleep");
             try {
                 Thread.sleep(5000);
             } catch (InterruptedException e) {
                                 System.out.println(Thread.currentThread().getName());
                 Thread.currentThread().interrupt();
                 System.out.println("after interrupt");
             }        
         System.out.println("after sleep");    
         
         try {
             Thread.sleep(5000);
         } catch (InterruptedException e) {
             // TODO Auto-generated catch block
             //e.printStackTrace();
             System.out.println(Thread.currentThread().getName());
             Thread.currentThread().interrupt();
             System.out.println("after interrupt");
         }
         System.out.println("after sleep");    
     }
     
 }
 
 public class ThreadBasic {
     
     public static void main(String[] args) {
         
         Thread t = new Thread(new ThreadTest(), "thread-1");
         t.start();
         
         t.interrupt();
         System.out.println(t.isInterrupted());
     }
 }
分享到:
评论

相关推荐

    java中匿名内部类解读分析

    以下是对Java匿名内部类的详细解读: 首先,匿名内部类的创建方式是在`new`关键字后面直接定义类的主体。它可以是类的子类或实现一个接口。例如,如果我们有一个接口`pr`,我们可以这样创建一个匿名内部类: ```...

    java常用的代码——线程

    #### 代码解读 ```java try { System.out.println("线程开始运行"); Thread.sleep(10000); // 模拟线程睡眠10秒 System.out.println("线程继续运行"); } catch (InterruptedException e) { e.printStackTrace();...

    详细解读JAVA多线程实现的三种方式

    public static void main(String[] args) throws ExecutionException, InterruptedException { System.out.println("----程序开始运行----"); Date date1 = new Date(); int taskSize = 5; // 创建一个固定...

    Java终止线程实例和stop()方法源码阅读

    使用 interrupt() 方法的方法是通过调用 Thread 的 interrupt() 方法,线程可以捕捉到 InterruptedException 并终止自己的执行。 在 Java 中,stop() 方法已经被弃用,因为它可能会导致线程安全问题。因此,应该...

    转换Image数据为byte数组

    3. **异常处理**:同样,我们也应处理可能的异常,例如线程中断异常`InterruptedException`,以增强代码的稳定性。 #### 示例代码解读 ```java public static Image bytesToImage(byte[] bytes) { Image image = ...

    JAVA线程关于生产者和消费者问题代码个人修改版

    ### JAVA线程中的生产者与消费者问题解析及代码解读 #### 一、生产者与消费者问题简介 在多线程编程中,“生产者-消费者”模式是一种常见的解决资源分配问题的方法,尤其适用于处理数据流或者任务队列。该模式通过...

    04 并发编程专题08.zip

    以下是对这些核心概念的详细解读。 **Synchronized关键字** Synchronized是Java中的一个内置关键字,用于实现线程同步,防止多个线程同时访问同一块代码区域,以避免数据竞争和不一致性。它可以修饰方法或代码块,...

    Java线程(20210930172753).pdf

    由于文件内容包含大量重复的关键词,这很可能是OCR扫描时产生的错误,因此在解读时将会忽略这些重复部分,并尝试还原出完整的知识点。 标题《Java线程》暗示文档内容将会专注于Java语言中关于线程的设计与实现。...

    05-Java多线程并发编程JUC.pdf

    根据提供的文档内容,以下是关于Java多线程并发编程与JUC知识点的详细解读: 1. 线程的状态 Java线程在其生命周期中可以拥有不同的状态。线程可能处于以下几种状态: - 新建(New):线程被创建时的状态。 - 就绪...

    java代码-测试延时的效果

    - 如何解读结果,例如如何从控制台输出中判断延时效果 测试延时效果对于调试、性能优化和模拟真实环境中的延迟情况都非常重要。例如,开发者可能会创建一个模拟网络延迟的测试用例,以确保应用程序在延迟环境下仍能...

    android 手机 成功连接到互联网

    - `InterruptedException`:线程中断异常。 - **处理方式**:通过捕获异常并打印堆栈跟踪来记录错误信息。 #### 三、代码解读 ##### 1. **主活动类** `MainActivity` - **继承关系**:`extends BaseActivity`...

    多线程面试专题及答案.pdf

    使用`sleep()`不会导致线程在等待时被其他线程唤醒,除非有中断请求(`InterruptedException`)。 实现阻塞队列和解决生产者-消费者问题是并发编程的经典题目。Java的`BlockingQueue`接口提供了一系列的实现,如`...

    java窗口半透明

    #### 标题与描述解读 “Java窗口半透明”这一主题涉及如何在Java Swing中实现图形用户界面(GUI)中的窗口或组件具有半透明的效果。这对于创建视觉上吸引人的应用或者游戏非常有用。 #### 核心知识点解析 ##### 1....

    编程英语词汇

    本文将对给定文件中的部分内容进行详细解读,帮助读者加深对编程英语词汇的理解。 首先,JDK(Java Development Kit)是用于开发Java应用程序的一套工具和库,包括编译器(javac)、文档生成器(Javadoc)以及运行...

    阿里巴巴2015研发工程师A笔试卷及答案

    - 如果 `sleep()` 方法被中断,它将抛出一个 `InterruptedException` 异常。 #### `wait()` 方法: - `wait()` 方法定义在 `Object` 类中,因此任何对象都可以调用此方法。 - 调用一个对象的 `wait()` 方法会导致...

    JAVA项目常用异常处理汇总

    这种错误解读为“出现异常的运算条件”,可能还有其他的异常情况,届时具体情况具体分析。 6.没有访问权限(java.lang.IllegalAccessException) 这种异常的原因是权限问题,在程序访问某方法时注意一下访问权限...

    利用selenium爬虫抓取数据的基础教程

    文章中给出了一段 Java 示例代码,下面我们来详细解读这段代码: ```java public class Demo { private static WebDriver driver; static final int MAX_TIMEOUT_IN_SECONDS = 5; @BeforeClass public static ...

Global site tag (gtag.js) - Google Analytics