阻塞队列--线程安全的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()方法直接取出队头的元素,并不删除

0 0
原创粉丝点击