LinkedBlockingQueue 注记
近期看一个音频传输代码时,对方采用了LinkedBlockingQueue为生产者、消费者模式,来支撑读写线程。
个人感觉非常不错,因此也对这种方式进行总结,并梳理了一个基本的功能框架备用。主要两点:
1、当对queue采用take操作时,若队列为空则阻塞;
2、当对queue采用put操作时,若队列为满则阻塞;
package com.fredric; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue; public class Buffer { private BlockingQueue<BufferData> queue; public static class BufferData { public byte mData[]; public BufferData() {
mData = new byte[100];
}
} public Buffer(int bufferSize) {
queue = new LinkedBlockingQueue<BufferData>(bufferSize);
} public BufferData doGet(){
if(null != queue){
try {
return (BufferData) queue.take();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
} public boolean doPut(BufferData data){
try {
queue.put(data);
return true;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
}
package com.fredric;
public class Reader implements Runnable{
Buffer buffer;
public Reader(Buffer buffer){
this.buffer = buffer;
}
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(new String(buffer.doGet().mData)
+ " " + Thread.currentThread().getName());
}
}
package com.fredric; import java.util.Date;
import java.util.concurrent.BlockingQueue; import com.fredric.Buffer.BufferData; public class Writer implements Runnable{ Buffer buffer; public Writer(Buffer buffer){
this.buffer = buffer;
} @Override
public void run() {
BufferData temp = new BufferData();
String str = new Date().toString();
System.arraycopy(str.getBytes(), 0, temp.mData, 0, str.getBytes().length); if(true == buffer.doPut(temp)){
System.out.println(" Thread Name: " + Thread.currentThread().getName());
}
}
}
package com.fredric;
public class App {
public static void main(String[] args){
Buffer buffer = new Buffer(2);
Writer writer = new Writer(buffer);
Reader reader = new Reader(buffer);
for (int i = 0; i < 5; i++) {
new Thread(writer, "writer " + (i + 1)).start();
new Thread(reader, "reader " + (i + 1)).start();
}
}
}
LinkedBlockingQueue 注记的更多相关文章
- ArcGIS中的标注和注记
在ArcMap中可以使用标注和注记来识别要素,选择标注或注记取决于你需要如何控制文本显示以及在ArcMap中如何存储文本. 1.标注只是临时显示相关数据或字段 2.标注用于长时间保存数据以及显示方式. ...
- 关于arcgis engine的注记显示与关闭问题
1.注记的添加需要拿到IGeoFeatureLayer接口下的AnnotationProperties属性,转为IAnnotationLayerPropertiesCollection接口,并创建一个 ...
- 【ESRI论坛6周年征文】ArcEngine注记(Anno/ Label/Element等)处理专题 -入门篇
原发表于ESRI中国社区,转过来.我的社区帐号:jhlong http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=122097 ----------- ...
- 创建文本注记TextElement
1.创建一个字体 /// <summary> /// 字体设置 /// </summary> /// <param name="size">Th ...
- 创建线注记LineElement
1.根据2点创建一条线 /// <summary> /// 创建线 /// </summary> /// <param name="pnt1"> ...
- ArcMap 标注、注记、图形文本
标注.注记.图形文本 2016年8月10日10:29 ArcMap中怎样向地图添加文本,其中标注与注记是重点内容,此处对此进行总结. 参考链接: ①地图文本基本词汇: 什么是文本? ArcGIS 提供 ...
- 【ArcEngine入门与提高】Element(元素)、Annotation(注记)旋转
因项目需要,需要做一个旋转注记的工具.因为注记这玩意用的比较少,网上资源也很少,所以做起来相当头疼.在经过一番研究之后,终于搞清楚注记的存储原理了,原来是和Element的类似,只不过注记是要把Ele ...
- WebGIS中自定义互联网地图局部注记的一种方案
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 前言 实际项目中我们经常会遇到这样一种场景:地图底图可能是互 ...
- ArcGIS连带文字注记导出为CAD格式
可以使用ArcGIS的"Export To CAD"工具将点.线.面等要素直接导出为CAD格式.如果要连带将ArcGIS中的文字标注导出为CAD格式要稍麻烦一点,下面是一个例子. ...
随机推荐
- margin:auto你真的理解么?
含义 margin:auto是具有强烈计算意味的关键字,用来计算元素对应方向应该获得的剩余空间大小 填充规则 (1) 如果一侧定值,一侧auto,则auto为剩余空间大小 (2) 如果两侧均是auto ...
- JavaScript ES6 新特性详解
JavaScript ES6 带来了新的语法和新的强大功能,使您的代码更现代,更易读 const , let and var 的区别: const , let 是 ES6 中用于声明变量的新关键字. ...
- 算法工程师<编程题>
<编程题> 1.[Maximum Product Subarray 求最大子数组乘积] 这个求最大子数组乘积问题是由最大子数组之和问题演变而来,但是却比求最大子数组之和要复杂,因为在求和的 ...
- insert into
1. INSERT INTO t1(field1,field2) VALUE(v001,v002); // 明确只插入一条Value 2. INSERT INTO t1(fiel ...
- MySQL/Oracle数据库优化总结
MySQL数据库优化的八种方式 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能 ...
- 2018-2019-2 网络对抗技术 20165328 Exp3 免杀原理与实践
一.实验要求: . 实践内容(.5分) .5分),msfvenom生成如jar之类的其他文件(.5分),veil-evasion(.5分),加壳工具(.5分),使用shellcode编程(1分) .5 ...
- 小程序+node+mysql做的小项目
git源码地址: https://github.com/songkangle/weixin_node 小程序页面 数据库 user表 dream表 node的express框架index.js var ...
- 从svn迁移至Git并保留所有 commit 记录
用户映射文件user.txt,等号左边为svn账号,右边为Git用户名和邮箱.注意:svn中有多少用户就要映射多少 test1=test1<147258369@qq.com>test2=t ...
- MySQL 常用命令(Linux)
一.查看MySQL服务 MySQL服务应该随开机自动启动的.正常情况下,查看开机自动启动的服务使用chkconfig命令,如下: chkconfig --list 实际mysql是否真正启动,是否真正 ...
- C&C++ Calling Convention
tkorays(tkorays@hotmail.com) 调用约定(Calling Convention) 是计算机编程中一个比较底层的设计,它主要涉及: 函数参数通过寄存器传递还是栈? 函数参数从左 ...