`

使用两个容量为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();
			}
		}
	}
}
分享到:
评论

相关推荐

    生产者与消费者 进程的同步与互斥模拟

    一个就绪队列(ready),两个等待队列:生产者等待队列(producer);消费者队列(consumer)。一个链表(over),用于收集已经运行结束的进程 本程序通过函数模拟信号量的操作。 参考书目: 1)徐甲同等编,计算机...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_concurrent_user_guide_en.pdf,一个中文翻译的 java_util_concurrent...

    java并发包资源

    本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_concurrent_user_guide_en.pdf,一个中文翻译的 java_util_concurrent...

    NodeJS如何实现同步的方法示例

    众所周知,异步是得天独厚的特点和优势,但同时在程序中同步的需求(比如控制程序的执行顺序为:func1 -&gt; func2 -&gt;func3 )也是很常见的。 下面这篇文章主要介绍了关于NodeJS实现同步的相关内容,NodeJS被打上了单...

    操作系统进程间通信五种方式

    共享内存是指两个进程可以访问同一个物理内存位置的机制,可以让多个进程之间通过对共享内存在内存中读写来完成信息交换,因此具有高效性和灵活性,但是也需要开发人员考虑并发控制和同步的问题。 信号量通信 信号...

    操作系统课程实验.rar

    (4) 利用 linux 的消息队列通信机制实现两个线程间的通信: 编写程序创建两个线程:sender 线程和 receive 线程,其中 sender 线程运行函数 sender(), 它创建一个消息队列,然后,循环等待用户通过终端输入一串字符...

    java并发包&线程池原理分析&锁的深度化

    并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。...列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue。

    通过研究经典的进程同步问题,采用“读写平等”的策略,用信号量 和 PV 操作实现对读者/写者问题的并发控制

    (3)读者和写者均有两个以上,可在程序运行期间动态增加读者与写者; (4)可读取样例数据(要求存放在外部文件中),进行读者/写者、进入内存时 间、读写时间的初始化; (5)要求将运行过程用可视化界面动态显示...

    NodeJS实现同步的方法

    nodeJS的异步实现:nodeJS有一个任务队列,在使用setInterval函数的时候,会每隔特定的时间向该任务队列增加任务,从而实现“多任务”处理。但是,“特定的时间”不代表是具体的时间,也有可能是会大于我们设定的...

    Vs线程框架

    1.使用工厂模式 创建多线程,向任务... 当一个线程调用Wait操作时,它要么得到资源然后将信号量减一,要么一直等下去(指放入阻塞队列), 直到信号量大于等于一时。Release(释放)实际上是在信号量上执行加操作*/

    采用时间片轮转算法的进程调度程序

    1) 每一个进程有一个PCB,其内容可以根据具体情况设定。 2) 可以在界面设定的互斥资源(包括两...6) 采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以及相应的阻塞队列 7) 具有一定的数据容错性

    《计算机操作系统》期末复习指导

    死锁是两个或两个以上的进程中的每一个,都在等待其中另一个进程释放资源而被封锁,它们都无法向前推进,称这种现象为死锁现象。 产生死锁的原因是共享资源有限,多个进程对共享资源的竞争,而且操作不当。 ...

    个人总结的深入java多线程开发

    8)阻塞队列BlockingQueue 34 9)已完成任务队列CompletionService 36 10)计时器CountDownLatch 37 11)周期性同步工具CyclicBarrier 38 12)异步计算的结果Future 40 13)安排线程池ScheduledExecutorService 40 五多...

    计算机操作系统课程设计报告《生产者---消费者问题》.doc

    生产者和消 费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不 用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队 列里取,阻塞队列就相当于一个缓冲区...

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

    (3)简化异步事件的处理:服务器应用程序在接受来自多个远程客户端的请求时,如果为每个连接都分配一个线程并且使用同步IO,就会降低开发难度 (4)用户界面具备更短的响应时间:现代GUI框架中大都使用一个...

    操作系统课设高响应比优先算法 带报告

    设计要求(多道、单处理机): 1) 每一个进程有一个PCB,其内容可以...6) 采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以及相应的阻塞队列 7) 具有一定的数据容错性 有些代码需要自己适当改下

    操作系统生产者与消费者(综合性实验)北林

    实验内容: ...一个就绪队列(ready),两个等待队列:生产者等待队列(producer);消费者等待队列(consumer)。一个链表(over),用于收集已经运行结束的进程 本程序通过函数模拟信号量的原子操作。

    数据持久化方案redisDB.zip

    redis运行时连接数据库 cache失效时同步读mysql, 数据修改时候通过消息队列通知DB线程写mysql reids.conf增加几个配置选项 mysql_host mysql_port mysql_user mysql_pwd mysql_dbname persistence_mmap_file: 消息...

    高响应比进程调度程序

    1)每一个进程有一个PCB,其内容可以根据具体情况设定。 2)可以在界面设定的互斥资源(包括两种:...6)采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以及相应的阻塞队列 7)具有一定的数据容错性

Global site tag (gtag.js) - Google Analytics