如何進(jìn)行并發(fā)工具類CountDownLatch與CyclicBarrier分析,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司自2013年起,先為黃陂等服務(wù)建站,黃陂等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為黃陂企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
CountDownLatch
基本的流程是一個(gè)線程等待其他的線程完成工作以后再執(zhí)行,加強(qiáng)版join
類的主要方法,await用來(lái)等待,countDown(在線程里面)用來(lái)減一。
由初始化線程決定是否放行。
我們來(lái)用代碼演示下CountDownLatch的基本使用:
public class UserCountDownLatch {
static CountDownLatch latch = new CountDownLatch(6);
//初始化線程
private static class InitThread implements Runnable{
@Override
public void run() {
System.out.println("Thread_"+Thread.currentThread().getId()+" ready init work ...");
latch.countDown();//初始化線程完成工作了??垡淮?/code>
}
}
public static void main(String[] args) throws InterruptedException {
//單獨(dú)的初始化線程,初始化分為2步,需扣減兩次
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work step lst.....");
latch.countDown();//每完成一步工作,就扣減一次
System.out.println("begin step 2nd......");
Thread.sleep(1000);
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work step 2nd.....");
latch.countDown();//每完成一步工作,就扣減一次
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
for(int i=0;i<=3;i++){
Thread thread = new Thread(new InitThread());
thread.start();
}
latch.await();
System.out.println("Main do ites work ....");
}
}
結(jié)果:
Thread_14 ready init work ...Thread_12 ready init work ...Thread_11 ready init work ...Thread_13 ready init work ...Thread_10 ready init work step lst.....begin step 2nd......Thread_10 ready init work step 2nd.....Main do ites work ....
小結(jié):就必須等到countDown減完才開(kāi)始執(zhí)行main方法后面的程序。
CyclicBarrier
讓一組線程達(dá)到某個(gè)屏障,被阻塞,一直到組內(nèi)最后一個(gè)線程達(dá)到屏障時(shí),屏障開(kāi)放,所有被阻塞的線程會(huì)繼續(xù)運(yùn)行。
由工作線程決定是否運(yùn)行。
我們來(lái)用代碼演示下CyclicBarrier的基本使用:
public class UseCyclicBarrier { private static CyclicBarrier barrier = new CyclicBarrier(5,new CollectThread());//屏障開(kāi)放后,CollectThread()就會(huì)執(zhí)行. private static ConcurrentHashMap<String, Long> resultMap = new ConcurrentHashMap<String, Long>();//存放子線程工作結(jié)果的容器 public static void main(String[] args){ for(int i=0;i<=4;i++){ Thread thread = new Thread(new SubThread()); thread.start(); } } //負(fù)責(zé)屏障開(kāi)放以后的工作 private static class CollectThread implements Runnable{ @Override public void run() { StringBuilder result = new StringBuilder(); for(Map.Entry<String, Long> workResult:resultMap.entrySet()){ result.append("["+workResult.getValue()+"]"); } System.out.println("the result = "+result); System.out.println("do other business......"); } } //工作線程 private static class SubThread implements Runnable{ @Override public void run() { long id = Thread.currentThread().getId(); resultMap.put(Thread.currentThread().getId()+"", id); Random r = new Random();//隨機(jī)決定工作線程的是否睡眠 try{ if(r.nextBoolean()){ Thread.sleep(2000+id); System.out.println("Thread_"+id+".....do its business "); } System.out.println(id+".....is await"); barrier.await();// Thread.sleep(1000+id); System.out.println("Thread_"+id+".....do its business "); }catch(Exception e){ e.printStackTrace(); } } } }
小結(jié):在初始化的時(shí)候,開(kāi)放屏障后,可以使用指定執(zhí)行的線程。
CyclicBarrier(int parties,RunnablebarrierAction)
不同在于動(dòng)作的實(shí)施者是不同的,CountDownLatch的下一步動(dòng)作實(shí)施者是main函數(shù),而CyclicBarrier下一步的動(dòng)作實(shí)施者可以為其他線程。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。
當(dāng)前名稱:如何進(jìn)行并發(fā)工具類CountDownLatch與CyclicBarrier分析
文章來(lái)源:http://jinyejixie.com/article46/gpeceg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、軟件開(kāi)發(fā)、自適應(yīng)網(wǎng)站、用戶體驗(yàn)、搜索引擎優(yōu)化、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)