Java 阻塞队列 模拟 异步处理
来源:互联网 发布:java 线程的嵌套 编辑:程序博客网 时间:2024/05/21 10:34
本例用阻塞队列模拟一个异步处理的过程,代码如下
package add.asyn;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.Scanner;import java.util.concurrent.BlockingQueue;import java.util.concurrent.CountDownLatch;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.TimeUnit;public class AsyncHandler {private CountDownLatch latch; //控制资源释放private volatile boolean handleFinish; //处理完成标识private volatile boolean sendFinish; //写入本地文件完成private BlockingQueue<String> queue; //阻塞队列private BufferedWriter bw;public AsyncHandler(CountDownLatch latch){this.latch = latch;queue = new LinkedBlockingQueue<String>();File file = new File("E:\\hello.txt");try{bw = new BufferedWriter(new FileWriter(file));}catch(IOException ex){throw new RuntimeException();}}/*offer,add区别:一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。 poll,remove区别:remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似,但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。 peek,element区别:element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null*/public void handle(){new Thread(){public void run(){while(!handleFinish){try{TimeUnit.SECONDS.sleep(3);}catch(InterruptedException e1){//不处理}String s = queue.peek();if(s != null){queue.poll();try{bw.write(s);bw.newLine();}catch(IOException ex){//不做处理}}//若队列为空 并且 消息发送完成if(queue.isEmpty() && sendFinish){latch.countDown(); //计数器1->0handleFinish = true;break;}}}}.start();}public void sendFinish(){ //给出消息返送完成的标识sendFinish = true;}public void release(){ //释放资源System.out.println("release!");if(bw != null){try {bw.flush();bw.close();} catch (IOException e) {e.printStackTrace();}}if(queue != null){queue.clear();queue = null;}}public void sendMsg(String text){if(text != null && !text.isEmpty()){queue.add(text);}}public static void main(String[] args){CountDownLatch latch = new CountDownLatch(1);AsyncHandler handler = new AsyncHandler(latch);handler.handle();//做一次检查Scanner scanner = new Scanner(System.in);while(true){String text = scanner.next(); //这是阻塞的if("exit".equals(text)){//消息发送完成handler.sendFinish();break;}handler.sendMsg(text);}try {latch.await();} catch (InterruptedException e) {e.printStackTrace();}//释放资源handler.release();//关闭控制台scanner.close();}}
0 0
- Java 阻塞队列 模拟 异步处理
- java模拟阻塞队列的实现
- Java多线程之模拟一个阻塞队列
- java并发控制(2),synchronized模拟阻塞队列
- java中模拟一个阻塞队列(多线程)
- java多线程并发处理之阻塞队列LinkedBlockingQueue用法
- java阻塞队列以及非阻塞队列
- java阻塞队列与非阻塞队列
- java 阻塞队列
- JAVA 阻塞队列 ArrayBlockingQueue
- Java中的阻塞队列
- java阻塞队列
- Java 阻塞队列 BlockingQueue
- Java的阻塞队列
- Java中的阻塞队列
- java阻塞队列
- java 阻塞队列BlockingQueue
- java多线程-阻塞队列
- Android Studio 插件Plugin Error找不到的问题
- microsoft Visio 2010的使用和word的交互
- HDU 1133 Buy the Ticket DP+java大数
- Logcat内容输入到指定文件中
- static variable/function
- Java 阻塞队列 模拟 异步处理
- windows下svn服务器及客户端搭建
- [BZOJ3624][Apio2008]免费道路(并查集)
- 解决v4,v7包冲突问题
- Image2Lcd 使用的一个体会
- IO中同步、异步与阻塞、非阻塞的区别
- websocket安全分析
- 解决问题的能力
- 同步通信与异步通信区别