`

使用两个容量为1的阻塞队列实现同步通知的功能

阅读更多
package concurrency;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueCommunication {
	public static void main(String[] args) {
		final Business business = new Business();
		new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 1; i <= 10; i++) {
					business.sub(i);
				}

			}
		}).start();

		for (int i = 1; i <= 10; i++) {
			business.main(i);
		}

	}

	static class Business {
		final BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);
		final BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1);

		// 匿名构造方法 (实例初始化)
		{
			try {
				queue2.put(1);// 主线程后执行
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		public void sub(int i) {
			try {
				queue1.put(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			for (int j = 1; j <= 5; j++) {
				System.out.println("sub thread sequece of " + j + ",loop of " + i);
			}
			try {
				queue2.take();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		public void main(int i) {
			try {
				queue2.put(1);
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			for (int j = 1; j <= 5; j++) {
				System.out.println("main thread sequece of " + j + ",loop of " + i);
			}
			try {
				queue1.take();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
分享到:
评论

相关推荐

    Java实现简单的阻塞队列2种方式

    这两种方法都能实现简单的阻塞队列,但`wait()`和`notify()`更基础,需要手动管理线程唤醒和锁释放,而`CountDownLatch`提供了一种更加抽象、易于使用的同步机制。然而,实际生产环境中,Java提供了更高级的并发工具...

    java线程聊天室(阻塞队列实现)

    【Java线程聊天室(阻塞队列实现)】 在Java编程中,多线程是构建并发应用程序的关键技术。在创建一个线程聊天室时,我们通常会涉及到多个线程之间的交互,例如用户发送消息、接收消息以及处理网络通信等。而阻塞...

    阻塞队列(Blocking Queue)是一个支持两个附加操作的队列.txt

    阻塞队列的主要特点在于它支持两个额外的条件操作:当队列为空时,尝试从队列中取元素的操作会被阻塞,直到队列中出现新的元素;同样地,当队列已满时,尝试向队列中添加元素的操作也会被阻塞,直到队列中出现可用...

    14-阻塞队列BlockingQueue实战及其原理分析二.pdf

    阻塞队列(BlockingQueue)是一种特殊的队列,它支持两个附加操作:阻塞的插入方法put和阻塞的移除方法take。BlockingQueue继承了Queue接口,是Java 5中加入的。 BlockingQueue常用方法示例: 1. add(E e):添加一...

    并发-线程池和阻塞队列

    在Java编程中,"并发-线程池和阻塞队列"是两个核心概念,它们在多线程环境下处理任务调度和数据同步方面发挥着重要作用。线程池是一种管理线程资源的有效方式,而阻塞队列则常用于线程间通信和数据共享。 线程池...

    linux使用消息队列实现进程间双向通信

    6. **安全与同步**:由于多线程环境下可能存在竞争条件,所以需要使用适当的同步机制,如互斥锁(mutex)或信号量,来保护对消息队列的访问。 7. **清理资源**:在不再需要消息队列时,使用`msgctl`的`IPC_RMID`...

    利用消息队列实现进程间通信

    首先,我们有两个进程,进程A和进程B。这两个进程可能执行不同的任务,但需要通过某种方式交换信息。在C语言中,我们可以使用System V或POSIX消息队列API来创建、发送和接收消息。 `msgsend.c` 文件很可能是实现...

    可以阻塞读的循环队列

    这个框架展示了如何在C语言中实现一个阻塞的多线程安全循环队列。实际应用中,还需要考虑内存管理、错误处理、优化等细节问题。在使用过程中,开发者可以根据需求调整队列的大小,选择合适的同步原语,甚至优化条件...

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

    阻塞队列的实现原理可以分为两个方面:锁机制和条件变量机制。锁机制是指在访问队列时,需要获取锁,以保证线程安全。条件变量机制是指在队列为空或满时,使用wait和notify方法来实现线程之间的同步。 下面是一个...

    生产者/消费者模式 阻塞队列 LinkedBlockingQueue

    在Java中,阻塞队列(BlockingQueue)是一个很好的实现生产者/消费者模式的工具,而LinkedBlockingQueue则是Java并发包(java.util.concurrent)中提供的一个具体实现。 LinkedBlockingQueue是一个基于链表结构的...

    C++数据结构与算法之双缓存队列实现方法详解

    双缓存队列通过使用两个队列A和B,交替写入和读取数据,避免了数据丢失的问题。 知识点二:双缓存队列的实现方法 双缓存队列的实现方法可以使用C++实现,通过使用模板类DoubleArray来实现双缓存队列。DoubleArray...

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

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

    消息分发框架(基于JAVA阻塞队列实现、 生产者消费者模型)

    通过使用阻塞队列,生产者在队列满时会自动阻塞,直到有空间可存;同样,消费者在队列空时也会被阻塞,直至有新的数据可用。这种模式有效地解耦了生产者和消费者的执行,使得它们可以独立地扩展和运行。 ### 多线程...

    Java并发编程(21)并发新特性-阻塞队列和阻塞栈(含代

    在Java并发编程中,阻塞队列和阻塞栈是两个重要的并发数据结构,它们在多线程环境下的高效通信和资源管理中扮演着至关重要的角色。这些数据结构源自Java的并发包`java.util.concurrent`,是实现并发设计模式如生产者...

    java学习(基于Java阻塞队列的搜索实例).pdf

    通过以上分析,我们了解到基于Java阻塞队列的搜索实例利用了Java并发API的强大功能来实现多线程间的高效协作,从而完成复杂的文件搜索任务。在多线程编程实践中,理解阻塞队列的工作原理和正确使用它们是关键的一步...

    快速非阻塞并发队列算法

    5. **两锁队列算法**:通过使用两个锁来控制并发访问,允许一定程度的并行操作而减少阻塞。 #### 实现细节 - **非阻塞并发队列**:该算法利用CAS等原子操作实现,确保在多线程环境下数据的一致性和完整性。每个...

    设备驱动中阻塞与非阻塞及实现

    在Linux设备驱动编程中,阻塞与非阻塞操作是两个关键的概念,它们涉及如何处理设备操作中的等待和同步问题。阻塞操作是指当进程尝试访问一个不可用的资源时,该进程会被挂起,直到资源变为可用。而非阻塞操作则允许...

    基于cas的无锁队列实现

    无锁队列通常由两个环形数组(front和rear)表示,用于存储元素。front表示队头,rear表示队尾。为了简化问题,我们假设数组大小为2的幂,这样可以方便地通过位运算进行索引计算。 #### 2. 入队操作 入队操作需要...

    OC- 并发队列在同步线程中执行

    例如,如果一个任务在同步执行时尝试访问另一个被阻塞的任务,那么两个任务都将无法继续,导致程序挂起。 5. **内存管理**:GCD负责管理队列和任务的生命周期,因此你不需要手动释放队列。然而,确保在任务中正确...

    利用P、V操作实现进程同步与互斥

    在这个例子中,两个进程PA和PB都需要访问打印机,通过设置一个互斥信号量mutex,初始值设为1,保证了打印机一次只能被一个进程使用。当PA进程执行P(mutex)后,如果mutex的值大于等于0,PA可以继续执行打印操作;如果...

Global site tag (gtag.js) - Google Analytics