国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

(九)java多線程之CyclicBarrier

lingdududu / 3209人閱讀

摘要:因為該在釋放等待線程后可以重用,所以稱它為循環的。若在繼續所有參與線程之前更新共享狀態,此屏障操作很有用。返回要求啟動此的參與者數目。查詢此屏障是否處于損壞狀態。將屏障重置為其初始狀態。

本人郵箱:
歡迎轉載,轉載請注明網址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代碼已經全部托管github有需要的同學自行下載

引言

一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的線程的程序中,這些線程必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待線程后可以重用,所以稱它為循環 的 barrier。

理論

CyclicBarrier 支持一個可選的 Runnable 命令,在一組線程中的最后一個線程到達之后(但在釋放所有線程之前),該命令只在每個屏障點運行一次。若在繼續所有參與線程之前更新共享狀態,此屏障操作 很有用。
示例用法:下面是一個在并行分解設計中使用 barrier 的例子:

class Solver {

final int N;
final float[][] data;
final CyclicBarrier barrier;

class Worker implements Runnable {
    int myRow;

    Worker(int row) {
        myRow = row;
    }

    public void run() {
        while (!done()) {
            processRow(myRow);
            try {
                barrier.await();
            } catch (InterruptedException ex) {
                return;
            } catch (BrokenBarrierException ex) {
                return;
            }
        }
    }
}

public Solver(float[][] matrix) {
    data = matrix;
    N = matrix.length;
    barrier = new CyclicBarrier(N,
            new Runnable() {
                public void run() {
                    mergeRows(...);
                }
            });
    for (int i = 0; i < N; ++i)
        new Thread(new Worker(i)).start();

    waitUntilDone();
}

}

在這個例子中,每個 worker 線程處理矩陣的一行,在處理完所有的行之前,該線程將一直在屏障處等待。處理完所有的行之后,將執行所提供的 Runnable 屏障操作,并合并這些行。如果合并者確定已經找到了一個解決方案,那么 done() 將返回 true,所有的 worker 線程都將終止。

如果屏障操作在執行時不依賴于正掛起的線程,則線程組中的任何線程在獲得釋放時都能執行該操作。為方便此操作,每次調用 await() 都將返回能到達屏障處的線程的索引。然后,您可以選擇哪個線程應該執行屏障操作,例如:

if (barrier.await() == 0) {

 // log the completion of this iteration

}
對于失敗的同步嘗試,CyclicBarrier 使用了一種要么全部要么全不 (all-or-none) 的破壞模式:如果因為中斷、失敗或者超時等原因,導致線程過早地離開了屏障點,那么在該屏障點等待的其他所有線程也將通過 BrokenBarrierException(如果它們幾乎同時被中斷,則用 InterruptedException)以反常的方式離開。

內存一致性效果:線程中調用 await() 之前的操作 happen-before 那些是屏障操作的一部份的操作,后者依次 happen-before 緊跟在從另一個線程中對應 await() 成功返回的操作。

CyclicBarrier(int parties) 創建一個新的 CyclicBarrier,它將在給定數量的參與者(線程)處于等待狀態時啟動,但它不會在啟動 barrier 時執行預定義的操作。

CyclicBarrier(int parties, Runnable barrierAction) 創建一個新的 CyclicBarrier,它將在給定數量的參與者(線程)處于等待狀態時啟動,并在啟動 barrier 時執行給定的屏障操作,該操作由最后一個進入 barrier 的線程執行。

await() 在所有參與者都已經在此 barrier 上調用 await 方法之前,將一直等待。

await(long timeout, TimeUnit unit) 在所有參與者都已經在此屏障上調用 await 方法之前將一直等待,或者超出了指定的等待時間。

getNumberWaiting() 返回當前在屏障處等待的參與者數目。

getParties() 返回要求啟動此 barrier 的參與者數目。

isBroken() 查詢此屏障是否處于損壞狀態。

reset() 將屏障重置為其初始狀態。

例子

還是一樣,理論是比較枯燥的,咱們還是舉例來說,比較生動一點.一些教科書舉一些1~100000分批累加例子.咱們不舉這種比較無聊的例子.旅游,相信很多人都喜歡吧!旅游的套路一般都出發點集合,入住酒店,到旅游點1,再到旅游點2,再到旅游點3,在集合返回.每次都某一個地點時.導游都會清點人數.不要把人給弄丟.ok,開始編碼...

首先寫一個旅游類 TourismRunnable,run方法很簡單就調用tourism()旅游的行程,然后在tourism,再調用旅游點路程,看代碼..

public class TourismRunnable implements Runnable{
    CyclicBarrier cyclicBarrier;
    Random random;
    public TourismRunnable(CyclicBarrier cyclicBarrier) {
        this.cyclicBarrier = cyclicBarrier;
        this.random = new Random();
    }

    @Override
    public void run() {
        tourism();
    }

    /**
     * 旅游過程
     */
    private void tourism() {
        goToStartingPoint();
        goToHotel();
        goToTourismPoint1();
        goToTourismPoint2();
        goToTourismPoint3();
        goToEndPoint();
    }

    /**
     * 裝備返程
     */
    private void goToEndPoint() {
        goToPoint("飛機場,準備登機回家");
    }

    /**
     * 到達旅游點3
     */
    private void goToTourismPoint3() {
        goToPoint("旅游點3");
    }

    /**
     * 到達旅游點2
     */
    private void goToTourismPoint2() {
        goToPoint("旅游點2");
    }

    /**
     * 到達旅游點1
     */
    private void goToTourismPoint1() {
        goToPoint("旅游點1");
    }

    /**
     * 入住酒店
     */
    private void goToHotel() {
        goToPoint("酒店");
    }

    /**
     * 出發點集合
     */
    private void goToStartingPoint() {
        goToPoint("出發點");
    }

    private int getRandomTime(){
        int time = this.random.nextInt(400) + 100;
        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return time;
    }

    private void goToPoint(String point){
        try {
            String name = Thread.currentThread().getName();
            System.out.println(name + " 花了 " + getRandomTime() + " 時間才到了" + point);
            cyclicBarrier.await();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在每個旅游點,每個人旅游所花的時間是隨機的,有些人玩的比較久一點,有些則走馬觀花,拍拍照就完事了

再寫一個測試類,讓一群小朋友去旅游吧

public class TestMain {

    public static void main(String[] args) {
        String name = "明剛紅麗黑白";
        CyclicBarrier cyclicBarrier = new CyclicBarrier(name.length(), new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() +
                        " 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....");
            }
        });
        List tourismThread = new ArrayList<>();
        for (char ch : name.toCharArray()){
            tourismThread.add(new Thread(new TourismRunnable(cyclicBarrier), "小" + ch));
        }
        for (Thread thread : tourismThread){
            thread.start();
        }
    }
}

運行結果:

小剛 花了 131 時間才到了出發點
小黑 花了 237 時間才到了出發點
小麗 花了 250 時間才到了出發點
小紅 花了 335 時間才到了出發點
小明 花了 379 時間才到了出發點
小白 花了 398 時間才到了出發點
小白 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....
小紅 花了 128 時間才到了酒店
小剛 花了 156 時間才到了酒店
小黑 花了 240 時間才到了酒店
小白 花了 280 時間才到了酒店
小明 花了 492 時間才到了酒店
小麗 花了 499 時間才到了酒店
小麗 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....
小麗 花了 188 時間才到了旅游點1
小剛 花了 315 時間才到了旅游點1
小明 花了 374 時間才到了旅游點1
小白 花了 395 時間才到了旅游點1
小黑 花了 428 時間才到了旅游點1
小紅 花了 496 時間才到了旅游點1
小紅 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....
小明 花了 206 時間才到了旅游點2
小剛 花了 223 時間才到了旅游點2
小紅 花了 302 時間才到了旅游點2
小白 花了 308 時間才到了旅游點2
小黑 花了 317 時間才到了旅游點2
小麗 花了 400 時間才到了旅游點2
小麗 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....
小白 花了 100 時間才到了旅游點3
小麗 花了 132 時間才到了旅游點3
小紅 花了 157 時間才到了旅游點3
小黑 花了 165 時間才到了旅游點3
小剛 花了 375 時間才到了旅游點3
小明 花了 416 時間才到了旅游點3
小明 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....
小剛 花了 100 時間才到了飛機場,準備登機回家
小黑 花了 137 時間才到了飛機場,準備登機回家
小紅 花了 232 時間才到了飛機場,準備登機回家
小明 花了 260 時間才到了飛機場,準備登機回家
小麗 花了 264 時間才到了飛機場,準備登機回家
小白 花了 394 時間才到了飛機場,準備登機回家
小白 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....

ok, 運行結果一目了然,中途沒有落下任何一個人!CyclicBarrier這個類,還是比較容易使用的

打賞

如果覺得我的文章寫的還過得去的話,有錢就捧個錢場,沒錢給我捧個人場(幫我點贊或推薦一下)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69921.html

相關文章

  • (十一)java線程Phaser

    摘要:本人郵箱歡迎轉載轉載請注明網址代碼已經全部托管有需要的同學自行下載引言講完了和今天講一個跟這兩個類有點類似的移相器中引入了一種新的可重復使用的同步屏障稱為移相器擁有與和類似的功勞但是這個類提供了更加靈活的應用和都是只適用于固定數量的參與者 本人郵箱: 歡迎轉載,轉載請注明網址 http://blog.csdn.net/tianshi_kcogithub: https://github....

    eccozhou 評論0 收藏0
  • Java線程進階(十八)—— J.U.Csynchronizer框架:CountDownLatc

    摘要:線程可以調用的方法進入阻塞,當計數值降到時,所有之前調用阻塞的線程都會釋放。注意的初始計數值一旦降到,無法重置。 showImg(https://segmentfault.com/img/remote/1460000016012041); 本文首發于一世流云的專欄:https://segmentfault.com/blog... 一、CountDownLatch簡介 CountDow...

    Elle 評論0 收藏0
  • Java線程進階(十)—— J.U.Csynchronizer框架:CyclicBarrier

    摘要:當到達柵欄后,由于沒有滿足總數的要求,所以會一直等待,當線程到達后,柵欄才會放行。任務其實就是當最后一個線程到達柵欄時,后續立即要執行的任務。 showImg(https://segmentfault.com/img/remote/1460000016010958); 本文首發于一世流云專欄:https://segmentfault.com/blog... 一、CyclicBarri...

    tulayang 評論0 收藏0
  • (十)java線程CountDownLatch

    摘要:本人郵箱歡迎轉載轉載請注明網址代碼已經全部托管有需要的同學自行下載引言有一個同步助手可以讓一個或一些線程等待直到另外一些線程執行完一些操作這就是理論在初始化的時候需要一個參數調用的線程會一直等待直到其他線程調用使清空為通常所有等待中的線程會 本人郵箱: 歡迎轉載,轉載請注明網址 http://blog.csdn.net/tianshi_kcogithub: https://github...

    陳江龍 評論0 收藏0
  • Java線程編程同步器

    摘要:倒計時鎖,線程中調用使進程進入阻塞狀態,當達成指定次數后通過繼續執行每個線程中剩余的內容。實現分階段的的功能測試代碼拿客網站群三產創建于年月日。 同步器 為每種特定的同步問題提供了解決方案 Semaphore Semaphore【信號標;旗語】,通過計數器控制對共享資源的訪問。 測試類: package concurrent; import concurrent.th...

    liangdas 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<