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控制多線程的執(zhí)行順序// (二),多個(gè)線程同時(shí)工作時(shí)// (三),但有一個(gè)線程需要等其他線程結(jié)束后才能開始 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; // 阻塞隊(duì)列 private BlockingQueue queue; private BufferedWriter bw; private boolean finshedHandle = false; // 線程能發(fā)現(xiàn)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; } } // 往隊(duì)列發(fā)送消息 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) {} // 隊(duì)列中獲取 String s = queue !=null? queue.peek():null; if(s != null) { // remove彈出 queue.poll(); try { bw.write(s); bw.newLine(); } catch(Exception ex) {} } // 隊(duì)列為空 if(sendFinished) { /* CountDownLatch 是一個(gè)同步工具類, 用來(lái)協(xié)作多個(gè)線程間的同步,或起到線程間通信 (而不是互斥)。 (一),他是通過(guò)計(jì)數(shù)器來(lái)實(shí)現(xiàn)的, (二),計(jì)數(shù)器的初始值為線程的數(shù)量 * (三),每當(dāng)一個(gè)線程完成任務(wù)后, (四),計(jì)數(shù)器的值就會(huì)減1。 * (五),當(dāng)計(jì)數(shù)器的值為0時(shí), (六),它表示所有線程已經(jīng)完成任務(wù) */ // 計(jì)數(shù)器1->0 latch.countDown(); finshedHandle = true; break; } } } } ).start(); } public static void main(String[] args)throws Exception { //(一),CountDownLatch這個(gè)類 //(二),可以使一個(gè)線程等待 //(三),其他線程完成任務(wù)后再執(zhí)行 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(); } }
相關(guān)推薦
推薦48個(gè)微商引流推廣的方法(微商引流推廣的方法有哪些)
微商引流技能01——同行互推 資源共享,大家才會(huì)共贏。加入你是做穴位貼的,你的朋友是做化妝品的,這是兩個(gè)沒(méi)有交集的行業(yè),你們可以友情互推,這樣每個(gè)月的資源就都擴(kuò)大了一倍,而且這些資…
2022年11月27日0存儲(chǔ)過(guò)程語(yǔ)法(sql server存儲(chǔ)過(guò)程語(yǔ)法)
今天小編給各位分享存儲(chǔ)過(guò)程語(yǔ)法的知識(shí),其中也會(huì)對(duì)sql server存儲(chǔ)過(guò)程語(yǔ)法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲(chǔ)過(guò)程基本語(yǔ)法…
2022年11月26日0寶可夢(mèng)朱紫寶主順序怎么選擇?寶可夢(mèng)朱紫寶主挑戰(zhàn)順序攻略
寶可夢(mèng)朱紫寶主順序如何選擇?寶主挑戰(zhàn)的順序有很多玩家都加入了討論,大家想要了解清楚正確的挑戰(zhàn)順序,接下來(lái)小編就給大家簡(jiǎn)單的介紹一下寶主挑戰(zhàn)的順序,各位趕緊通過(guò)下面的攻略多了解一下詳…
2022年11月25日0OPPO Reno9 Pro+硬件規(guī)格強(qiáng) 搭載驍龍8+旗艦處理器
OPPO Reno9系列正式發(fā)布,Reno9 Pro+作為三款新機(jī)中定位最高的超大杯機(jī)型,整體配置較上一代有著大幅度的升級(jí),如果單看硬件配置的話,Reno9 Pro+甚至是目前OP…
2022年11月24日0cpu性能天梯圖2022 AMD CPU天梯圖最新排行榜出爐
用戶在DIY自己的主機(jī)時(shí)選擇CPU是非常關(guān)鍵的,CPU可以說(shuō)是電腦的大腦,大家也都想追求好一點(diǎn)的CPU來(lái)使用,但型號(hào)太多了,大部分的用戶都不知道目前哪一款CPU比較好用,快來(lái)看看詳…
2022年11月24日0寶可夢(mèng)朱紫道館及寶主攻略順序是什么 道館及寶主攻略順序匯總
作為寶可夢(mèng)資深愛(ài)好者,小伙伴們對(duì)寶可夢(mèng)朱紫里面的所有道館恨不得馬上跳過(guò),當(dāng)場(chǎng)就來(lái)挑戰(zhàn)地區(qū)冠軍,但這顯然是不可能的,你得按照游戲里面遇到的順序來(lái)進(jìn)行挑戰(zhàn)。那么具體的挑戰(zhàn)順序是什么樣的…
2022年11月24日0《戰(zhàn)神5》混沌之火怎么獲得?混沌之火獲得方法一覽
戰(zhàn)神5中一共有8個(gè)混沌之火,混沌之火可以用來(lái)升級(jí)玩家的武器,很多玩家想知道戰(zhàn)神5混沌之火怎么獲得,下面就帶來(lái)戰(zhàn)神5混沌之火獲得方法一覽,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家…
2022年11月22日0我叫MT歸來(lái)墓園有什么用 我叫MT歸來(lái)墓園什么時(shí)候開啟?
多小伙伴是不是都不知道我叫MT歸來(lái)墓園有什么用?全明星激斗作為一款3D卡牌手游,受到了很多小伙伴的關(guān)注,我叫MT歸來(lái)墓園攻略小伙伴們知道了嗎?下面就和小編一起來(lái)了解一下吧。 我叫M…
2022年11月22日0oppopad2022和matepad11哪個(gè)好 區(qū)別不同點(diǎn)對(duì)比
一些想買平板的小伙伴們把目光投向了oppopad2022和matepad11,oppopad2022和matepad11這兩個(gè)平板哪個(gè)好呢,oppopad2022的處理器性能更好一…
2022年11月22日0英偉達(dá)4060顯卡什么時(shí)候發(fā)布 RTX4060發(fā)布時(shí)間
RTX4060什么時(shí)候出呢?不少小伙伴對(duì)于這個(gè)RTX4060的上線時(shí)間不清楚,如果大家對(duì)此還不清楚的話可以看看這篇攻略,專門將會(huì)告訴大家RTX4060的具體發(fā)布時(shí)間。 RTX406…
2022年11月22日0