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格式要稍麻烦一点,下面是一个例子. ...
随机推荐
- Docker----在Docker中部署Asp.net core2.1以及修改发布
本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序,以及修改系统之后,发布更新.本文章采用自定义的Docker文件 系统要求: 1.服务器或本地已经安装docker 一.创建一 ...
- mysql 与 oracle 的连表update
mysql: update 表A a,表B b set a.xx=b.xx where a.id=b.id; oracle update 表A set a.xx=(select b.xx from 表 ...
- Excel藏的很深(1)
Excel 的强大功能, 神奇! 1.快速定位数据 ctrl+g 定位条件; 或者菜单中: 查找与选择->定位条件 (1) 删除所有的错误值(ref这种) (2) 实现空格自动填充0: ctr ...
- 网络流24题——数字梯形问题 luogu 4013
题目描述:这里 极其裸的一道费用流问题 首先分析第一问,由于要求一个点只能经过一次,所以我们将梯形中的每一个点拆成两个点(记为入点和出点,顾名思义,入点用来承接上一行向这一行的边,出点用来向下一行连边 ...
- js高级类型
一.funciton数据类型 1.定义:一个function类型对象,用于管理一个具体函数. function类型相当于Java中java.lang.reflect.Method 2.函数类型对象创建 ...
- 重置studio 3T 14天试用
重置studio 3T 14天试用 bat 脚本 @echo off ECHO Reset Studio 3T Date of use ... FOR /f "tokens=1,2,* &q ...
- leetcode python两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 不同 ...
- Vue 2.6 中部分引入 TypeScript 的方法
在 Vue 与 Cesium 联合开发的过程中,我发现很多 Cesium 代码不宜直接写在 .vue 文件中.同时由于 Cesium 库较为复杂,不借助 TypeScript 的静态类型会导致代码难维 ...
- sqlserver2008 批量插入数据
private DataTable GetTableSchema() { DataTable dt = new DataTable(); dt.Columns.AddRange(new DataCol ...
- nginx学习.第一部分
1.nginx的版本发布历史 2015年支持thread pool提供stream四层反向代理支持reuseport特性,支持http v2协议.完全可以替代LVS 2016年支持动态模块 2.ngi ...