`
a67474506
  • 浏览: 14705 次
社区版块
存档分类
最新评论

Condition的阻塞队列

阅读更多
package cn.zto.condition;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//阻塞队列
public class ConditionTest {
	Lock lock = new ReentrantLock();
	
	Condition notFull = lock.newCondition();
	Condition notEmpty = lock.newCondition();
	
	Object [] items = new Object[100] ;
	
	int putptr , takeptr , count;
	
	public void put (Object x) throws InterruptedException {
		lock.lock();
		try {
			while(count == items.length)
				notFull.await();
			items[putptr] = x ;
			if (++putptr == items.length) putptr = 0;
			count++;
			notEmpty.signal();
		} finally {
			lock.unlock();
		}
	}
	
	public Object take() throws InterruptedException {
		lock.lock();
		try {
			while(count == 0)
				notEmpty.await();
			Object x = items[takeptr];
			if (++takeptr == items.length) takeptr = 0;
			count--;
			notFull.signal();
			return x;
		} finally {
			lock.unlock();
		}
	}
}

 

 

分享到:
评论

相关推荐

    支持多线程和泛型的阻塞队列

    C++中,虽然标准库没有内置阻塞队列,但可以利用互斥锁(mutex)、条件变量(condition variable)等同步原语自定义实现。 ### 泛型 泛型是现代编程语言中的一个重要特性,允许在不指定具体类型的情况下编写代码,...

    c++11 实现的阻塞队列

    在 C++11 中,我们可以使用 std::mutex、std::condition_variable 和 std::queue 等标准库来实现阻塞队列。 阻塞队列的实现需要注意以下几点: 1. 线程安全:使用 std::mutex 来保护队列的读写操作,避免多线程...

    剖析Java中阻塞队列的实现原理及应用场景

    阻塞队列的实现依赖于Java的并发原语,如`Lock`和`Condition`。在内部,它们使用了等待/通知机制,当队列状态发生变化时(如添加或移除元素),会通过`Condition`对象通知等待的线程,使得线程可以被唤醒继续执行。...

    10、阻塞队列BlockingQueue实战及其原理分析

    阻塞队列的实现基于`Lock`和`Condition`机制,其中`Lock`用于控制对队列的访问,`Condition`用于实现阻塞和唤醒功能。例如,`ArrayBlockingQueue`使用`ReentrantLock`作为锁,并通过两个条件变量`notEmpty`和`not...

    java阻塞队列实现原理及实例解析.docx

    Java 阻塞队列(Blocking Queue)是一种特殊类型的并发数据结构,它在多线程编程中扮演着重要的角色。阻塞队列的核心特性在于其在队列为空或满时能够自动阻塞线程,从而实现线程间的同步和通信。这种机制使得生产者...

    java阻塞队列实现原理及实例解析

    Java阻塞队列实现原理及实例解析 Java阻塞队列是一种特殊的队列,它能够在队列为空或满时阻塞线程,使得线程之间能够更好地协作和通信。阻塞队列的实现原理是基于锁机制和条件变量机制的,通过wait和notify方法来...

    Java中的阻塞队列详细介绍

    阻塞队列的实现依赖于底层的锁机制,如`ReentrantLock`,以及条件变量,如`Condition`,来确保线程安全和阻塞/唤醒机制。 例如,ArrayBlockingQueue的公平访问可以通过构造函数的布尔参数控制,如`new ...

    Linux C++ 使用condition实现阻塞队列的方法

    在这个例子中,我们看到如何在Linux环境下使用C++和POSIX线程库(pthread)中的条件变量(condition variables)来实现阻塞队列。 首先,我们需要包含必要的头文件,并定义一个名为`BlockingQueue`的类。这个类包含了...

    可以阻塞读的循环队列

    在“可以阻塞读的循环队列”中,我们主要关注的是如何在队列满时阻止读取操作,直到有新的元素入队,以及如何确保在多线程环境中的安全性。 首先,我们来理解循环队列的基本概念。它由一个固定大小的数组和两个指针...

    Java源码解析阻塞队列ArrayBlockingQueue介绍

    Java源码解析阻塞队列ArrayBlockingQueue介绍是Java中的一种阻塞队列实现,使用ReentrantLock和Condition来实现同步和阻塞机制。本文将对ArrayBlockingQueue的源码进行详细分析,介绍其主要方法和实现机制。 1. ...

    linux中编写自己的并发队列类(Queue 并发阻塞队列)

    并发队列,尤其是并发阻塞队列,允许线程安全地插入和移除元素,同时支持超时限制和大小限制,这在高并发的系统中至关重要。 首先,原始的并发队列实现使用了一个单一的互斥锁(_lock)来保护队列(_list)的操作。当一...

    Java可阻塞队列-ArrayBlockingQueue

     ArrayBlockingQueue是由数组支持的有界阻塞队列,次队列按照FIFO(先进先出)原则,当队列已经填满,在去增加则会导致阻塞,这种阻塞类似线程阻塞。  ArrayBlockingQueue提供的增加和取出方法总结  使用...

    Java并发之条件阻塞Condition的应用代码示例

    Java并发之条件阻塞Condition的应用代码示例 Java并发之条件阻塞Condition是Java并发编程中的一种高级同步机制,它允许线程在某个条件下等待或唤醒其他线程。Condition将Object监视器方法(wait、notify和notifyAll...

    基于Linux实现简单的队列

    - **非阻塞队列**:不等待队列状态改变,若操作无法立即执行,则返回错误或特殊值,让调用者自行决定如何处理。 3. **线程安全**:在多线程环境下,线程安全意味着代码在并发执行时仍能保持正确性,不会出现数据不...

    C++基于消息队列的多线程实现示例代码

    当前线程会一直被阻塞,直到另外一个线程在相同的 std::condition_variable 对象上调用了 notification 函数来唤醒当前线程。 四、std::function std::function 可以将普通函数、lambda 表达式和函数对象统一起来...

    队列的C语言优化实现

    - 在高并发场景下,非阻塞队列(如基于原子操作的无锁队列)可以提高性能,避免线程被长时间阻塞。 - C11标准提供了原子操作(),可以用来实现无锁队列。 7. 双端队列(deque): - 对于某些场景,如需要同时...

    C++ 跨平台 异步消息队列

    在IT领域,尤其是在多线程编程中,异步消息队列是一种常见的设计模式,用于实现高效、非阻塞的消息通信。本项目名为"C++ 跨平台 异步消息队列",显然它提供了一个用C++编写的跨平台解决方案,用于在不同线程间安全地...

    多线程编程.docx

    - **阻塞队列**:是一种特殊的队列,当队列为空时,从队列中获取元素的操作将会被阻塞,直到队列中有新的元素被加入。同样地,当队列满时,向队列中添加元素的操作也会被阻塞,直到队列中有空余空间。 - **...

    队列分享-易群1

    在特定场景下,我们可能需要一种能够自动处理队列满或空情况的机制,这就是阻塞队列(BlockingQueue)的作用。阻塞队列在Java中由`java.util.concurrent`包中的`BlockingQueue`接口提供,它解决了在多线程环境下,...

Global site tag (gtag.js) - Google Analytics