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;public class AsyncExecute {// (一),用CountDownLatch控制多线程的执行顺序// (二),多个线程同时工作时// (三),但有一个线程需要等其他线程结束后才能开始 public AsyncExecute(CountDownLatch cdl) { this.latch = cdl; queue = new LinkedBlockingQueue(); File file = new File(“F:xbl1.sql”); try{ bw = new BufferedWriter(new FileWriter(file)); } catch(Exception ex) { ex.printStackTrace(); } } // 控制资源释放 private CountDownLatch latch; // 阻塞队列 private BlockingQueue queue; private BufferedWriter bw; private boolean finshedHandle = false; // 线程能发现volatile变量最新值 private volatile boolean sendFinished = false; public void sendFinish() { sendFinished = true; } // 释放资源 public void release() { System.out.println(“release..”); if (bw != null) { try { bw.close(); } catch (IOException e) { } } if(queue != null) { queue.clear(); queue = null; } } // 往队列发送消息 public void sendMsg(String text) { queue.add(text); } public void handle() { // 模拟性能瓶颈每3秒 new Thread( new Runnable() { public void run() { while(!finshedHandle) { try { Thread.sleep(3000); } catch(Exception ex) {} // 队列中获取 String s = queue !=null? queue.peek():null; if(s != null) { // remove弹出 queue.poll(); try { bw.write(s); bw.newLine(); } catch(Exception ex) {} } // 队列为空 if(sendFinished) { /* CountDownLatch 是一个同步工具类, 用来协作多个线程间的同步,或起到线程间通信 (而不是互斥)。 (一),他是通过计数器来实现的, (二),计数器的初始值为线程的数量 * (三),每当一个线程完成任务后, (四),计数器的值就会减1。 * (五),当计数器的值为0时, (六),它表示所有线程已经完成任务 */ // 计数器1->0 latch.countDown(); finshedHandle = true; break; } } } } ).start(); } public static void main(String[] args)throws Exception { //(一),CountDownLatch这个类 //(二),可以使一个线程等待 //(三),其他线程完成任务后再执行 CountDownLatch latch = new CountDownLatch(1); AsyncExecute async = new AsyncExecute(latch); async.handle(); Scanner scanner = new Scanner(System.in); while(true) { String text = scanner.next(); if(text.equals(“exit”)) { async.sendFinish(); break; } async.sendMsg(text); } try { // 阻塞主线程,等待消息写入到本地文件完成 latch.wait(); } catch(Exception ex) {} async.release(); scanner.close(); } }
相关推荐
推荐48个微商引流推广的方法(微商引流推广的方法有哪些)
微商引流技能01——同行互推 资源共享,大家才会共赢。加入你是做穴位贴的,你的朋友是做化妆品的,这是两个没有交集的行业,你们可以友情互推,这样每个月的资源就都扩大了一倍,而且这些资…
2022年11月27日0存储过程语法(sql server存储过程语法)
今天小编给各位分享存储过程语法的知识,其中也会对sql server存储过程语法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! oracle存储过程基本语法…
2022年11月26日0宝可梦朱紫宝主顺序怎么选择?宝可梦朱紫宝主挑战顺序攻略
宝可梦朱紫宝主顺序如何选择?宝主挑战的顺序有很多玩家都加入了讨论,大家想要了解清楚正确的挑战顺序,接下来小编就给大家简单的介绍一下宝主挑战的顺序,各位赶紧通过下面的攻略多了解一下详…
2022年11月25日0OPPO Reno9 Pro+硬件规格强 搭载骁龙8+旗舰处理器
OPPO Reno9系列正式发布,Reno9 Pro+作为三款新机中定位最高的超大杯机型,整体配置较上一代有着大幅度的升级,如果单看硬件配置的话,Reno9 Pro+甚至是目前OP…
2022年11月24日0cpu性能天梯图2022 AMD CPU天梯图最新排行榜出炉
用户在DIY自己的主机时选择CPU是非常关键的,CPU可以说是电脑的大脑,大家也都想追求好一点的CPU来使用,但型号太多了,大部分的用户都不知道目前哪一款CPU比较好用,快来看看详…
2022年11月24日0宝可梦朱紫道馆及宝主攻略顺序是什么 道馆及宝主攻略顺序汇总
作为宝可梦资深爱好者,小伙伴们对宝可梦朱紫里面的所有道馆恨不得马上跳过,当场就来挑战地区冠军,但这显然是不可能的,你得按照游戏里面遇到的顺序来进行挑战。那么具体的挑战顺序是什么样的…
2022年11月24日0《战神5》混沌之火怎么获得?混沌之火获得方法一览
战神5中一共有8个混沌之火,混沌之火可以用来升级玩家的武器,很多玩家想知道战神5混沌之火怎么获得,下面就带来战神5混沌之火获得方法一览,感兴趣的小伙伴一起来看看吧,希望能帮助到大家…
2022年11月22日0我叫MT归来墓园有什么用 我叫MT归来墓园什么时候开启?
多小伙伴是不是都不知道我叫MT归来墓园有什么用?全明星激斗作为一款3D卡牌手游,受到了很多小伙伴的关注,我叫MT归来墓园攻略小伙伴们知道了吗?下面就和小编一起来了解一下吧。 我叫M…
2022年11月22日0oppopad2022和matepad11哪个好 区别不同点对比
一些想买平板的小伙伴们把目光投向了oppopad2022和matepad11,oppopad2022和matepad11这两个平板哪个好呢,oppopad2022的处理器性能更好一…
2022年11月22日0英伟达4060显卡什么时候发布 RTX4060发布时间
RTX4060什么时候出呢?不少小伙伴对于这个RTX4060的上线时间不清楚,如果大家对此还不清楚的话可以看看这篇攻略,专门将会告诉大家RTX4060的具体发布时间。 RTX406…
2022年11月22日0