`
alloyer
  • 浏览: 33209 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

并发编程之使用信号量来限制工作队列的容量

阅读更多
    并发编程中,经常要用到线程池相结合的工作队列,来实现一个小的线程池与一个大的队列组成的处理框架。这有助于在并发程序中减轻CPU和内存的压力,又为众多任务的并行提供了保证。这时队列往往需要有长度限制,如果使用没有限制的队列来保存请求任务,这同样会危及到内存的管理,把程序置入了不安全的运行环境中。所以,工作队列应该有一个限制队列长度的选项,保证队列不会占用超出既定资源。

    计数信号量(Counting semaphore)用来控制能够同时访问某特定资源的活动的数量,或者同时执行某一给定操作数量。所以,用计数信号量可以实现对资源池或者工作队列的边界。一个Semaphore管理一个有效的许可集;许可的初始量通过构造函数传递给Semaphore。在还存在剩余许可的情况下,活动能够获得许可,并在使用之后释放放可。如果已经没有可用的许可了,那么acquire会被阻塞,直到有可用的为止(或者直到被中断或超时)。release方法向信号量返回一个许可[1]。

下面是一个简单的有界的优先级阻塞队列的实现:
public class BoundedJobBlockingQueue {

	private final BlockingQueue<Job> jobs;

	private final Semaphore sem;

	public BoundedJobBlockingQueue(int bound) {
		jobs = new PriorityBlockingQueue<Job>();
		sem = new Semaphore(bound);
	}

	public boolean put(Job job) throws InterruptedException {
		try {
			sem.acquire();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		boolean wasAdded = false;
		try {
			wasAdded = jobs.add(job);
			return wasAdded;
		} finally {
			if (!wasAdded)
				sem.release();
		}
	}

	public Job take() throws InterruptedException {
		Job job = jobs.take();
		if (job != null)
			sem.release();
		return job;
	}

}


[1]B. Goetz等,Java并发编程实践
分享到:
评论

相关推荐

    java并发编程实战源码,java并发编程实战pdf,Java

    《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...

    C++并发编程实践 C++ Concurrency in Action

    - **信号量**:`std::semaphore`可用于限制系统资源的数量,例如连接池中的可用连接数量。 - **未来和承诺**:`std::future`和`std::promise`提供了一种异步通信机制,允许线程间传递值或异常。 #### 五、C++内存...

    Windows并发编程指南高清pdf版

    同时,本部分也探讨了并发编程中使用到的各种数据结构,例如线程安全的队列、字典等,以及如何选择合适的算法以适应并发环境,如在并行环境下提高排序、搜索等操作的效率。这些内容为读者提供了编写高效并发程序的...

    iOS并发编程指南.pdf

    除了上述的并发编程工具,iOS开发还提供了许多高级工具和概念,比如使用NSOperationQueue来取消操作、设置操作的依赖关系、使用完成块(completion block)来执行操作后的清理工作等。完成块是GCD中用于异步执行操作...

    JAVA并发编程艺术pdf版

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

    操作系统实验1用信号量来实现读者-写者问题

    根据提供的文件信息,我们可以从以下几个方面来...通过上述分析,我们可以看出该实验不仅让学生深入了解了读者-写者问题及其解决方案,还让学生实践了多线程编程和信号量机制,从而加深了对操作系统并发控制的理解。

    linux 网络编程 进程通信 信号量

    在实际编程中,信号量通常与条件变量一起使用,以实现更复杂的同步策略。例如,当资源可用时,信号量计数值会增加,等待的进程会被唤醒;当资源被占用时,进程会释放资源并降低信号量计数值。 总结来说,Linux网络...

    并发编程demo测试包含线程池、锁、队列、信号、cas等等

    信号(信号量/Semaphore)是另一种同步原语,用于限制同时访问特定资源的线程数量。它可以看作是“许可证”,当线程获取一个许可证后才能执行特定操作。在Java中,Semaphore类实现了信号量功能,它提供了acquire()和...

    Java并发编程设计原则和模式

    3. Semaphore:信号量,用于控制对有限资源的访问权限,常用于限流和同步。 六、线程安全与内存模型 1. Java内存模型(JMM):定义了线程之间如何共享和交互数据,以及对内存可见性的保证。 2. volatile、...

    多线程 教程 各种锁 半成品的CAS 临界区 信号量 事件 互斥锁 队列

    在IT领域,多线程是并发编程中的重要概念,它允许多个任务在同一时间执行,提高了计算机系统的资源利用率和程序的响应速度。本教程将深入探讨多线程相关的知识点,包括各种锁机制、条件变量、半成品的CAS操作、临界...

    Java并发编程学习笔记

    Java并发包(java.util.concurrent)也提供了丰富的并发工具,如线程安全集合(如ConcurrentHashMap)、阻塞队列(如ArrayBlockingQueue)、信号量(Semaphore)、并发集合(如CopyOnWriteArrayList)和各种执行器...

    Java 并发编程实战 中英文+代码示例

    6. **线程池**:Executor框架是Java并发编程的重要组成部分,讲解ThreadPoolExecutor的使用,包括线程池的参数配置、工作队列的选择以及线程池的生命周期管理。 7. **死锁与活锁**:分析可能导致线程死锁的原因,...

    Java并发编程实战

    5.5.3 信号量 5.5.4 栅栏 5.6 构建高效且可伸缩的结果缓存 第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1 串行地执行任务 6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的...

    Java并发编程的设计原则与模式

    3. **Semaphore**:信号量,用于限制同时访问特定资源的线程数量。 4. **ExecutorService**:线程池服务,管理线程的生命周期,可以提交任务并控制并发级别。 五、并发编程最佳实践 1. **避免共享可变状态**:尽...

    进程间通信-2,有名无名管道,信号量,消息队列,共享内存。

    实验代码通常会包含示例程序,演示如何使用这些IPC机制创建进程,分配和访问共享内存,使用信号量进行同步,以及通过有名管道或消息队列进行数据传输。通过实践,开发者可以更深入地理解这些通信方式的工作原理,...

    Go并发编程实践.pdf

    根据提供的文档信息,我们可以深入探讨Go语言中的并发编程实践,特别是关于互斥锁(Mutex)的使用、实现细节以及其在Go并发模型中的演变过程。 ### 标题:Go并发编程实践 ### 描述:Go并发编程实践 该文档主要...

    信号量的使用

    在本文中,我们将深入探讨信号量的定义、类型、工作原理,以及如何在实际编程中使用它。我们还将通过源代码分析来理解其运作方式。 信号量,源于荷兰计算机科学家Dijkstra的发明,是并发控制的一种抽象数据类型。它...

    Linux课件之7信号量、共享内存和消息队列.ppt

    在C语言中,可以使用`&lt;sys/ipc.h&gt;`和`&lt;sys/sem.h&gt;`头文件中的`semget`、`semop`和`semctl`系统调用来操作信号量。 - `semget`函数用于创建一个新的信号量集合或获取已存在的信号量集合的ID。参数包括关键字(key)...

    JAVA并发编程实战.pdf

    - **使用信号量Semaphore**:利用信号量控制生产和消费的次数,从而达到同步的目的。 #### 2. 银行账户转账示例 - **账户余额一致性问题**:解决多个线程同时进行转账时可能发生的账户余额不一致的问题。 - **使用...

    java多线程并发编程例子

    `TestSemaphore.java`可能包含了如何使用`Semaphore`来限制系统资源(如数据库连接)的并发访问。 7. **FutureTask**:`FutureTask`实现了`Future`接口,它表示一个异步计算的结果。你可以提交一个`Callable`给`...

Global site tag (gtag.js) - Google Analytics