`
sunhuaer123
  • 浏览: 6325 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java并行开发笔记4

    博客分类:
  • java
阅读更多

不可靠的取消操作将把生产者置于阻塞的操作中

 

	class BrokenPrimeProducer extends Thread{
		private final BlockingQueue<BigInteger> queue;
		private volatile boolean cancelled = false;
		
		BrokenPrimeProducer(BlockingQueue<BigInteger> queue){
			this.queue = queue;
		}
		
		public void run(){
			try{
				BigInteger p = BigInteger.ONE;
				while(!cancelled)
					queue.put(p = p.nextProbablePrime());
			}catch(InterruptedException consumed){
				
			}
		}
		
		public void cancel(){ cancelled = true;}
	}
	
	void consumePrimes() throws InterruptedException {
		BlockingQueue<BigInteger> primes = ...;
		BrokenPrimeProducer producer = new BrokenPrimeProducer(primes);
		producer.start();
		try{
			while(needMorePrimes()){
				consume(primes.take());
			}
		}finally{
			producer.cancel();
		}
	}

 上述代码中,生产者线程生成素数,并将它们放入一个阻塞队列。如果生产者的速度超过了消费者的处理速度,队列将被填满,put方法也会阻塞。当生产者在put方法中阻塞时,如果消费者希望取消生产任务,那么将发生什么情况?它可以调用cancel方法来设置cancelled标志,但此时生产者却永远不能检查这个标志,因为它无法从阻塞的put方法中恢复过来(因为消费者此时已经停止从队列中取出素数,所以put方法将一直保存阻塞状态)。

  为了解决上述问题,可通过线程中断代替取消操作,具体代码如下:

class BrokenPrimeProducer extends Thread{
		private final BlockingQueue<BigInteger> queue;
		
		BrokenPrimeProducer(BlockingQueue<BigInteger> queue){
			this.queue = queue;
		}
		
		public void run(){
			try{
				BigInteger p = BigInteger.ONE;
				while(!Thread.currentThread().isInterrupted())
					queue.put(p = p.nextProbablePrime());
			}catch(InterruptedException consumed){
				
			}
		}
		
		public void cancel(){ interrupt();}
	}

 

分享到:
评论

相关推荐

    java精华学习笔记

    Java精华学习笔记主要涵盖了Java编程语言的核心概念、关键特性以及实战技巧。这些笔记是作者在深入学习Java过程中积累的经验总结,旨在帮助初学者快速...通过深入学习和实践,可以逐步精通Java编程,应对各种开发挑战。

    B站java狂神说笔记

    Apache是常见的开源软件项目,其产品如Tomcat(Java EE应用服务器)、HttpClient(网络通信库)、Log4j(日志框架)等在Java开发中广泛应用。笔记可能会介绍如何集成和使用这些工具。 总结,【Java狂神说笔记】是一...

    java学习好用的笔记

    Java是一种广泛使用的面向对象的编程...通过系统学习和实践,初学者可以逐步掌握Java编程,为后续的软件开发和系统设计打下坚实的基础。在阅读笔记时,结合实际编写代码,不断练习和调试,是提升Java技能的最佳途径。

    Java JDK 7学习笔记 PDF

    Java JDK 7是Java开发工具包的一个重要版本,它的全称是Java Development Kit,是用于构建和运行Java应用程序的关键组件。这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些...

    达内core_java学习笔记

    理解线程的并发执行、同步机制(如synchronized关键字和Lock接口)以及线程通信,对于开发高效并行程序非常重要。 九、反射与注解 反射机制允许在运行时动态地获取类的信息并操作类的对象。注解是一种元数据,用于...

    李兴华java1.8视频笔记

    反射机制在Java中的应用广泛,特别是在框架开发和各种底层API中。 类集框架是Java集合框架的简称,提供了表示和操作集合的接口和类。Java集合框架主要包括Collection接口和Map接口,以及它们的多个子接口和实现类。...

    java JDK 8学习笔记

    Java JDK 8是Java开发工具集的一个重要版本,它的发布带来了许多创新特性和改进,极大地提升了开发者的工作效率。本学习笔记旨在深入解析JDK 8的关键特性,帮助初学者快速掌握这一版本的核心知识。 1. **lambda...

    java8学习笔记

    标题“java8学习笔记”表明了这是一份关于Java 8版本的学习资料,Java 8是Java编程语言的一个重要版本,它在2014年发布,包含了许多新的特性,例如lambda表达式、新的日期时间API、Stream API、接口中的默认方法和...

    最全的java学习笔记(必看).pdf

    Java中的线程是程序执行流的最小单位,提供并行计算的能力。Thread类用于表示线程,可以通过创建Thread类的子类或实现Runnable接口来创建线程。 JDK的安装和配置对于Java开发至关重要。路径(PATH)和类路径...

    Java堆栈内存分析笔记

    本笔记将深入探讨这两个区域的工作原理以及如何进行有效的分析。 首先,我们要理解Java内存的两个主要部分:堆(Heap)和栈(Stack)。堆主要用于存储对象实例,而栈则用于存储基本类型变量和对象引用。堆内存是...

    Java与生活-Markdown格式的笔记

    涵盖了Java的各个方面,包括但不限于IO流(模拟生活中的数据传输)、线程(如同生活中的并行任务)、网络编程(如互联网上的通信)以及Java的库和框架(如Spring框架在软件开发中的角色,就像生活中的基础设施,简化...

    Java大数据课程核心笔记

    Java大数据课程核心笔记是针对那些想要深入理解和应用Java在大数据领域的开发者所准备的宝贵资源。这份笔记涵盖了Java的基础以及在大数据处理中的应用,适合不同层次的学习者,无论你是初入编程殿堂的新手,还是有着...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《java jdk 7学习笔记》适合java的初中级读者,以及广大java应用开发人员。 作译者 林信良(网名:良葛格) 学历:台湾大学电机工程学系 经历:台湾升阳教育训练技术顾问、专业讲师,oracle授权训练中心讲师 ...

    java高并发笔记.docx

    【Java高并发笔记】 在Java开发中,处理高并发场景是一项关键技能,涉及到多个核心概念。以下是关于同步、异步、并发、并行、临界区、阻塞、非阻塞以及死锁、饥饿和活锁的详细解释。 1. **同步与异步** - **同步*...

    随时更新-小白实习生的Java学习笔记.rar

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。这份"随时更新-小白实习生的Java学习笔记.rar"压缩包包含了实习生在学习Java过程中积累的知识点,主要涵盖了Java的基础、数据库操作、多...

    Java JDK 8学习笔记 带完整书签(不是页码书签哦)

    在Java JDK 8中,引入了一系列重大更新,极大地提升了开发效率和代码的可读性。首先,书中会详细讲解Lambda表达式,这是Java 8的核心特性之一。Lambda允许将匿名函数作为方法参数传递,简化了多线程编程和事件处理,...

    黑马程序员_java8新特性详解笔记和源码

    Java 8是Java语言发展的一个重要里程碑,引入了许多创新性的特性和改进,极大地提升了开发效率和代码质量。本文将深入探讨Java 8的三大关键新特性:接口的默认方法实现、Lambda表达式以及一系列相关的变化。 一、...

    实战Java高并发程序设计 .pdf 下载

    在过去单核CPU时代,单任务在一个时间点只能执行单一程序,随着多核CPU的发展,并行程序开发就显得尤为重要。 《实战Java高并发程序设计》主要介绍基于Java的并行程序设计基础、思路、方法和实战。第一,立足于...

    Java JDK 7学习笔记 完整扫描版

    Java JDK 7(Java Development Kit 7)是Java编程语言的一个重要版本,由Sun Microsystems(后被Oracle公司收购)开发,并于2011年7月28日正式发布。这个版本引入了一系列新特性、改进和优化,旨在提升开发者的工作...

Global site tag (gtag.js) - Google Analytics