`
jncz
  • 浏览: 29355 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

并发编程学习笔记5

    博客分类:
  • java
阅读更多
阻塞的队列和生产者消费者模式
主要讲述了,jdk5,6提供的各种阻塞队列。
最有意思的是jdk6中提供的双向队列Deque和BlockDeque,这种队列的工作原理很有意思,他们自己有自己的producer,然后一般来说都自己去消费生产的东西,但是如果某个队列已经将自己的消费完了,那么他会从别人的队列末尾取东西然后消费,大大减少竞争的几率。这种模式也叫作“Work Stealing"

阻塞和中断方法
线程在等待IO结束,获取锁,等待被从Thread.sleep中唤醒,或者等待另一个线程计算结束的时候,都会被阻塞或者暂停。当一个线程阻塞了,他通常会被暂时搁置并处于几种阻塞状态之一(BLOCKED,WAITING,TIMED_WAITING).一个阻塞的操作和一个原始的普通的操作的差别仅仅是阻塞的线程必须等待一个非他控制的事件,然后才能继续完成IO操作,或者锁的获得,或者是计算的完成。当一个外部事件发生之后,线程将被该变成RUNNABLE状态并且重新被调度。比如,当一个线程在等待一个IO结束的时候,他被阻塞了,然后当一个外部事件发生之后,这种阻塞结束,而这个线程继续自己的执行。

如果一个方法抛出InterruptedException,则表明他是一个阻塞方法,更进一步的说,如果他被打断执行,那么他会尽力使自己尽早脱离阻塞。

Thread提供了interrupt方法,用来中断一个线程和查询一个线程是否被中断了。每个线程都有一个boolean属性用来表示其中断状态,当中断一个方法的时候该值将被设置。

Interruption是一个合作的方法。一个线程不能强迫另一个线程停止他所作的事情或者强迫另一个线程作别的东西;当A线程interrupt线程B的时候,A仅仅是向B发送一个请求,请求B在方便的时候中断当前所作的事情。中断最大的用处就是用来取消一个活动。

如果你的代码调用了一个能抛出InterruptionException的方法,那么你的方法也就成为了一个阻塞的方法,那么你必须为中断这种情况作出反应,必须有相应的处理措施。对于library来说,一般有两种选择:
1.继续传递InterruptionException。将该异常传递给他的调用者,由调用着负责处理。
2.恢复中断。有时候,你不能抛出中断异常,比如当你的代码是Runnable的一部分。在这些情况下,你必须捕获中断异常然后调用当前线程的interrupt方法来恢复中断状态,这样调用栈的上层代码将能发现有中断流出。

现在可能更加对中断迷惑了。但是在绝大多数的情况下,以上两种方法都能工作。但是有一件事情你不能作,那就是捕获了中断异常但是却没作任何反应。如果你这么作了,那么调用栈上层代码就没有机会为中断作出反应--线程中断的信息已经丢失了。

public class TaskRunnable implements Runnable {
    BlockingQueue<Task> queue;
    ...
    public void run() {
        try {
            processTask(queue.take());
        } catch (InterruptedException e) {
             // restore interrupted status
             Thread.currentThread().interrupt();
             //将中断信息保留下了,如果没有这些,则中断信息丢失
        }
    }
}
分享到:
评论

相关推荐

    Java并发编程学习笔记.rar

    这本"Java并发编程学习笔记"可能是作者在深入研究Java并发特性、工具和最佳实践过程中积累的心得体会。下面,我们将根据这个主题,探讨一些关键的Java并发编程知识点。 1. **线程与进程**:在多任务环境中,线程是...

    Java并发编程学习笔记

    Java并发编程是Java开发中必不可少的一部分,涉及到多线程、同步机制、线程池以及并发工具类等多个核心知识点。以下是对这些主题的详细说明: 1. **线程安全与锁 Synchronized 底层实现原理**: 线程安全是指在多...

    java并发编程学习笔记

    ### Java并发编程学习笔记知识点详解 #### 一、Java并发编程概述 Java并发编程是指在Java应用程序中同时执行多个操作的技术。它通过多线程、线程池等机制实现资源的有效利用,提高程序运行效率。Java并发编程的...

    Java并发编程学习笔记 pdf 多线程编程

    Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...

    java并发编程实践笔记

    ### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 1. **不要跨线程访问共享变量:** 当多个线程共享某个变量时,若其中一个线程修改了该变量,其他线程若没有正确同步,则可能读取到错误的数据。...

    JUC并发编程学习笔记(硅谷)

    "JUC并发编程学习笔记(硅谷)"很可能包含了关于Java并发工具集(Java Util Concurrency, JUC)的深入理解和实战经验。JUC是Java标准库提供的一套强大的并发处理工具,它极大地简化了多线程编程,提高了程序的可读性...

    Java并发编程学习笔记.

    Java并发编程是Java开发中的重要领域,它涉及到多线程、同步、锁机制、线程池等关键概念,是提高程序性能和效率的关键技术。在Java中,并发编程的运用可以充分利用多核处理器的能力,实现高效的多任务处理。以下是对...

    Java并发编程与高并发解决方案-学习笔记-www.itmuch.com.pdf

    本文将基于文档《Java并发编程与高并发解决方案-学习笔记***.pdf》中提供的内容,来详细阐述并发编程和高并发的基本概念、CPU多级缓存与缓存一致性、以及Java内存模型。 ### 并发与高并发概念 在现代多线程编程中...

    Java并发编程系列心得笔记

    Java并发编程系列心得笔记,可以参考,欢迎共同交流学习

    多线程与高并发编程笔记、源码等

    标题“多线程与高并发编程笔记、源码等”表明了资源的核心内容,涵盖了多线程和高并发编程的理论与实践。多线程允许一个应用程序同时执行多个任务,而高并发则指系统能够处理大量并发请求的能力。这两个概念在现代...

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    GoLang学习资源_学习笔记和并发编程实战

    通过阅读"Go语言学习笔记",你可以建立起对Go语言全面的认知,然后借助"Go并发编程实战"来深化对并发编程的理解,结合实际编写示例程序,将理论知识转化为实践经验。 在学习过程中,建议先从基础语法开始,掌握变量...

    并发编程之一 日常学习笔记

    综上所述,这一系列学习笔记涵盖了并发编程的关键概念和实战技巧,包括Java内存模型、线程池、并发容器的使用以及常见数据结构的线程安全问题。通过深入学习这些内容,开发者可以更好地理解和解决多线程环境下的编程...

    Java并发编程与高并发解决方案笔记-基础篇.docx

    Java并发编程与高并发解决方案是开发高性能应用的关键技术。在基础篇中,主要涉及以下几个重要知识点: 1. **并发编程基础** - **并发**:并发是指在一个时间段内,多个线程交替执行,使得系统看起来像是同时处理...

    Java并发编程与高并发解决方案-学习笔记-www.itmuch.com.rar

    java并发编程与并发解决方案是自己多年开发和学习的笔记,有助于(ˇˍˇ) 想~进一步提高的java开发工程师或架构师深入的学习java架构并发处理。同时,它也是 在实际工作中多年高并发解决方案和经验的总结

    Java并发编程与高并发解决方案-学习笔记.pdf

    并发编程与高并发解决方案的学习笔记中,首先对并发与高并发进行了基本概念的介绍。并发指的是同时存在多个执行单元,但并不一定同时发生;而高并发是指系统能够同时处理很多的请求,这对于互联网分布式系统架构设计...

    图灵Java高级互联网架构师第6期并发编程专题笔记.zip

    01-并发编程之深入理解JMM&并发三大特性(一)-fox 02-并发编程之深入理解JMM&并发三大特性(二)-fox 03-01-HashMap源码解析-monkey 03-并发List、Set、 ConcurrentHashMap底层原理剖析-monkey 04-Java并发线程池...

Global site tag (gtag.js) - Google Analytics