阻塞队列--线程安全的LinkedBlockingQueue
来源:互联网 发布:售假仅退款淘宝介入 编辑:程序博客网 时间:2024/05/16 01:59
BlockingQueue, 队列, LinkedBlockingQueue, 阻塞队列, LinkedBlockingQueue实现BlockingQueue
什么叫线程安全?
线程安全就是每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的。
线程安全就是说多线程访问同一代码,不会产生不确定的结果。
并行和并发区别
1、并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑;
2、并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A,交替使用,目的是提高效率。
<span style="color:#4b4b4b;"> //</span><span style="color:#009900;">这个是一个线程, 在定义队列之前</span>
<span style="color: rgb(75, 75, 75);">public void run() {List<String> analyzeList=null;try {analyzeList = fileParser.parse(channelCharset, fileContent, fileParserMap);if(analyzeList!=null){for(String data:analyzeList){if(StringUtils.isNotEmpty(data)){</span><span style="color:#009900;">dataQueue.put(data); //将解析:一行一行读出的list放到队列里面, 然后队列就赋值了</span><span style="color:#4b4b4b;">}}}} catch (Exception e) {logger.error("当前回单文件解析异常 :result size:0",e);}}</span>
<span style="color:#4b4b4b;"></span><span style="color:#009900;">BlockingQueue<String> dataQueue = new LinkedBlockingQueue<String>(); //定义一个队列</span><span style="color:#4b4b4b;">byte[] filecontent = null;// 3.下载文件try {filecontent = fssClient.getFileContent(CommonFileConstant.FILE_SEVER_APP_CODE, fssId, CommonFileConstant.DOWNLOAD_TIMEOUT);if (filecontent == null) {logger.error(CommonsFileAnalyzeErrorCodes.ERROR_FILE_DOWNLOAD.getMessage());throw new CommonsFileAnalyzeException(CommonsFileAnalyzeErrorCodes.ERROR_FILE_DOWNLOAD.getMessage());}logger.info("已从文件服务器获取文件file,fsscId:" + fssId);// 4.根据文件后缀名获取解析器if(StringUtils.isEmpty(fileSuffix)||fileSuffix.equals("TXT")){fileSuffix=CommonFileSuffixEnum.TXT.getName();}if(StringUtils.isEmpty(fileSuffix)||fileSuffix.equals(FileSuffix)){fileSuffix=CommonFileSuffixEnum.TXT.getName();}IFileParser fileParser = fileParserMap.get(StringUtils.lowerCase(fileSuffix));// 初始化线程池ExecutorService poolddp = Executors.newCachedThreadPool();poolddp.execute(new AnalyzeCommonFileThread(charset, fileParser, fileParserMap, filecontent, dataQueue));poolddp.shutdown();poolddp.awaitTermination(1, TimeUnit.HOURS);while (!dataQueue.isEmpty()) {<span style="background-color: rgb(51, 204, 0);">l_datas.add(dataQueue.remove()); //remove() 方法删除第一条数据</span>}</span>
LinkedBlockingQueue是一个线程安全的阻塞队列,实现了先进先出等特性,是作为生产者消费者的首选,可以指定容量,也可以不指定,不指定的话默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法将一个对象放到队列尾部,在队列满的时候会阻塞直到有队列成员被消费,take方法从head取一个对象,在队列为空的时候会阻塞,直到有队列成员被放进来。
常用方法如下:
add(anObject):
把anObject添加到BlockingQueue里,添加成功返回true,如果BlockingQueue空间已满则抛出异常。
offer(anObject):
表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false。
put(anObject):
把anObject加到BlockingQueue里,如果BlockingQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里有空间再继续。
poll(time):
获取并移除此队列的头,若不能立即取出,则可以等time参数规定的时间,取不到时返回null。
take():
获取BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的对象被加入为止。
clear():
从队列彻底移除所有元素。
remove()方法直接删除队头的元素
peek()方法直接取出队头的元素,并不删除
- 阻塞队列--线程安全的LinkedBlockingQueue
- 阻塞队列 BlockingQueue LinkedBlockingQueue
- 阻塞队列--LinkedBlockingQueue
- 阻塞队列LinkedBlockingQueue用法
- 阻塞队列--LinkedBlockingQueue
- 链阻塞队列 LinkedBlockingQueue
- 阻塞队列之LinkedBlockingQueue
- 并发队列ConcurrentLinkedQueue与阻塞队列LinkedBlockingQueue的区别
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用的实例
- 四 : LinkedBlockingQueue 链阻塞队列
- linkedBlockingQueue实现事件阻塞队列
- 阻塞队列LinkedBlockingQueue源码分析
- 阻塞队列LinkedBlockingQueue源码分析
- Java常用的2种阻塞队列ArrayBlockingQueue和LinkedBlockingQueue
- (原创)JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
- JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
- JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue
- 初步理解JDBC
- centos配置mysql 5.7数据库
- Git 操作记录
- 连接池配置c3p0、dbcp、tomcat jdbc pool 及常用数据库的driverClass和驱动包
- Android中的动画
- 阻塞队列--线程安全的LinkedBlockingQueue
- 知乎页面出bug了,显示”^Method "question.20946770" (None) is not found.MethodNotFound“
- 添加一个文件夹及一些文件如何使用git生成patch git补丁 新文件 图片资源文件
- windows7旗舰版64位安装时出现选择需要安装的驱动程序
- 变量的操作函数 unset()
- HTTP Status 500 - Tag file directory /tagfiledoes not start with "/WEB-INF/tags"
- .NET简谈互操作(三:基础知识之DllImport特性)
- 简单工厂模式
- 函数式编程