`
Copperfield
  • 浏览: 260953 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:25208
社区版块
存档分类

并发编程陷阱系列 (二)InterruptException无处不在

 
阅读更多

当一个方法抛出 InterruptedException 时,它是在告诉您,如果执行该方法的线程被中断,它将尝试停止它正在做的事情而提前返回,并通过抛出 InterruptedException 表明它提前返回。

一旦你catch了中断异常,默认你就会处理它,所以JVM会清除中断状态,以防止方法退出后上层调用代码再处理一次异常。如果你只是简单地catch住,并不打算处理,那么就需要恢复被清除的中断位,让上层知晓,所以需要调用interrupt()

切忌生吞InterruptedException 异常,正确的做法:

1、将异常传递给调用方。

public class TaskQueue {
    private static final int MAX_TASKS = 1000;

    private BlockingQueue<Task> queue 
        = new LinkedBlockingQueue<Task>(MAX_TASKS);

    public void putTask(Task r) throws InterruptedException { 
        queue.put(r);
    }

    public Task getTask() throws InterruptedException { 
        return queue.take();
    }
}

 2、在重新抛出 InterruptedException 之前执行特定于任务的清理工作。

 

public class PlayerMatcher {
    private PlayerSource players;

    public PlayerMatcher(PlayerSource players) { 
        this.players = players; 
    }

    public void matchPlayers() throws InterruptedException { 
        try {
             Player playerOne, playerTwo;
             while (true) {
                 playerOne = playerTwo = null;
                 // Wait for two players to arrive and start a new game
                 playerOne = players.waitForPlayer(); // could throw IE
                 playerTwo = players.waitForPlayer(); // could throw IE
                 startNewGame(playerOne, playerTwo);
             }
         }
         catch (InterruptedException e) {  
             // If we got one player and were interrupted, put that player back
             if (playerOne != null)
                 players.addFirst(playerOne);
             // Then propagate the exception
             throw e;
         }
    }
}
 3、捕捉 InterruptedException 后恢复中断状态

例如当由 Runnable 定义的任务调用一个可中断的方法时,就是如此。在这种情况下,不能重新抛出 InterruptedException,但是您也不想什么都不做。当一个阻塞方法检测到中断并抛出 InterruptedException 时,它清除中断状态。如果捕捉到 InterruptedException 但是不能重新抛出它,那么应该保留中断发生的证据,以便调用栈中更高层的代码能知道中断,并对中断作出响应。该任务可以通过调用 interrupt() 以 “重新中断” 当前线程来完成。

public class TaskRunner implements Runnable {
    private BlockingQueue<Task> queue;

    public TaskRunner(BlockingQueue<Task> queue) { 
        this.queue = queue; 
    }

    public void run() { 
        try {
             while (true) {
                 Task task = queue.take(10, TimeUnit.SECONDS);
                 task.execute();
             }
         }
         catch (InterruptedException e) { 
             // Restore the interrupted status
             Thread.currentThread().interrupt();
         }
    }
}
参考: http://www.ibm.com/developerworks/cn/java/j-jtp05236.html
分享到:
评论

相关推荐

    java 并发编程的艺术pdf清晰完整版 源码

    9. **并发编程最佳实践**:最后,书中会提供一些并发编程的最佳实践,帮助读者避免常见的并发陷阱,写出更健壮、更高效的代码。 通过阅读《Java并发编程的艺术》这本书,开发者不仅可以掌握Java并发编程的基础知识...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发编程第一阶段16讲、采用优雅的方式结束线程生命周期.mp4 │ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力...

    JAVA并发编程艺术pdf版

    《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发编程第一阶段16讲、采用优雅的方式结束线程生命周期.mp4 │ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力...

    并发编程的艺术

    创建线程、启动线程、线程的生命周期(新建、就绪、运行、阻塞、死亡)以及线程间的通信(join、interrupt、yield、sleep)都是并发编程的基本操作。 3. **线程池**:Executor框架是Java 5引入的,用于管理和控制...

    Java并发编程全景图.pdf

    Java并发编程是Java语言中最为复杂且重要的部分之一,它涉及了多线程编程、内存模型、同步机制等多个领域。为了深入理解Java并发编程,有必要了解其核心技术点和相关实现原理,以下将详细介绍文件中提及的关键知识点...

    java线程与并发编程实践

    Java线程与并发编程实践是Java开发者必备的技能之一,特别是在多核处理器和高并发应用环境中,有效地管理和利用线程能极大地提升程序的性能。本书《java线程与并发实践编程》由Jeff Friesen撰写,2017年2月出版,...

    《Java 并发编程实战》.zip

    《Java 并发编程实战》是一本专注于Java并发编程领域的权威书籍,旨在帮助开发者深入理解和掌握在多线程环境中编写高效、安全且可维护的代码。这本书涵盖了Java并发编程的基础概念,高级特性以及最佳实践,是Java...

    java并发编程分享

    Java并发编程是Java开发中的重要领域,它涉及到多线程、同步机制、线程池以及并发集合等核心概念。在Java中,并发编程是提高系统性能和资源利用率的关键技术,尤其是在处理大量I/O操作或者计算密集型任务时。本文将...

    JAVA并发编程实践-中文-高清-带书签-完整版

    《JAVA并发编程实践》是一本深入探讨Java多线程编程技术的专业书籍,旨在帮助开发者理解和掌握在Java平台上进行高效并发编程的关键知识。本书涵盖了从基本概念到高级特性的全面内容,是Java程序员进阶的必读之作。 ...

    《Java并发编程实战》PDF版本下载.txt

    根据提供的文件信息,我们可以推断出这是一份关于获取《Java并发编程实战》PDF版本的资源分享。然而,为了满足您对于生成相关知识点的需求,我们将围绕《Java并发编程实战》这本书的内容来展开讨论,深入解析Java...

    JAVA并发编程实践(中文)

    《JAVA并发编程实践》这本书深入探讨了Java平台上的并发编程技术,是IT行业专业人士和Java开发者深入了解并发编程原理与实践的宝贵资源。本书不仅涵盖了Java并发编程的基础理论,还提供了大量的实战案例,帮助读者...

    java并发编程实践

    《Java并发编程实践》这本书是Java开发者深入了解并发编程的重要资源,尤其对于初学者来说,它提供了许多实用的例子,帮助读者逐步掌握并发编程的核心概念和技术。并发编程是现代多核处理器环境下提升程序性能的关键...

    Java并发编程实践

    在探讨Java并发编程实践时,首先需要理解进程和线程这两个基本概念,以及它们在计算机科学中的作用和区别。在单道程序设计环境下,程序在运行时独占系统资源,并且具有封闭性和可再现性。封闭性意味着程序一旦开始...

    java并发编程实践的.pptx

    根据提供的文档内容,我们可以归纳并深入探讨Java并发编程的一些核心概念和原理,这些知识点对于理解和实践Java并发编程至关重要。 ### JVM内存模型 JVM内存模型是理解Java并发的基础。主要包含以下几个部分: ##...

    Java并发编程线程入门简介.pdf

    1. **并发编程基础**:Java自诞生以来就支持并发编程,提供了一系列的机制来处理多任务执行。并发编程的主要目标是利用多核处理器的能力,同时执行多个任务,提高程序的运行效率。 2. **进程与线程**:在操作系统中...

    并发编程代码.rar

    "并发编程代码.rar"这个压缩包很可能是包含了一系列用于理解和实践并发编程的示例代码。下面,我们将深入探讨并发编程相关的知识点。 首先,Java中的并发编程主要基于JVM(Java虚拟机)提供的线程机制。线程是执行...

    使用Java并发编程Concurrent Programming Using Java

    在本篇内容中,我们将深入探讨使用Java进行并发编程的核心概念、原理以及实践技巧。并发编程是现代软件开发中的一项关键技术,特别是在多核处理器日益普及的今天,掌握并发编程技术对于提升程序性能、响应性和资源...

Global site tag (gtag.js) - Google Analytics