真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Join,CountDownLatch,CyclicBarrier,Semaphore和Exchanger

       CountDownLatch允許一個(gè)或者多個(gè)線程等待其他線程完成操作,之后再對(duì)結(jié)果做統(tǒng)一處理;

十余年的郟縣網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整郟縣建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“郟縣網(wǎng)站設(shè)計(jì)”,“郟縣網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

        適用場(chǎng)景,分布式系統(tǒng)中對(duì)多個(gè)微服務(wù)的調(diào)用,并發(fā)執(zhí)行并且必須等待全部執(zhí)行完成才能繼續(xù)執(zhí)行后續(xù)操作;

        其實(shí)在java中默認(rèn)的實(shí)現(xiàn)是join()方法,join()方法主要的作用是當(dāng)前線程必須等待直到j(luò)oin線程執(zhí)行完成之后才能繼續(xù)執(zhí)行后續(xù)的操作,

        其本質(zhì)就是輪詢判斷join線程是否存活,如果存活則主線程繼續(xù)等待,否則,通過(guò)調(diào)用this.notifyAll()方法來(lái)繼續(xù)執(zhí)行主線程。

        實(shí)例代碼如下:

public static void main(String[] args) throws InterruptedException {

        Thread thread1 = new Thread(new Runnable() {

@Override

public void run() {

        System.out.println("this is thread 1");

        }

        });

        Thread thread2 = new Thread(new Runnable() {

@Override

public void run() {

        System.out.println("Thread2 is finish");

        }

        });

        thread1.start();

        thread2.start();

        /*thread1.join();

        thread2.join();*/ (1)

        System.out.println("all parser finish");

        }

        現(xiàn)在的代碼是注釋掉了兩個(gè)join()方法的調(diào)用,那么輸出結(jié)果將不能被保證,三個(gè)sout的輸出打印是亂序的。

        如果將上述的注釋(1)去掉,則根據(jù)join()方法的定義,可以知main線程會(huì)先等待thread1的執(zhí)行結(jié)束才會(huì)執(zhí)行thread2的執(zhí)行,直到thread2執(zhí)行結(jié)束才會(huì)繼續(xù)往下執(zhí)行輸出:

        "all parser finish";從而保證執(zhí)行順序固定,即線程thread1先執(zhí)行,其次是thread2的執(zhí)行,最后main線程執(zhí)行最后的輸出。

        那么同樣的如果我們用CountDownLatch來(lái)實(shí)現(xiàn),則應(yīng)用代碼如下:

static CountDownLatch c =  new CountDownLatch(2);//定義成員變量

public static void main(String[] args) throws InterruptedException{

        new Thread(new Runnable() {

@Override

public void run() {

        System.out.println(1);

        c.countDown();

        System.out.println(2);

        c.countDown();

        }

        }).start();

        c.await();

        System.out.println(3);

        }

        其中定義的CountDownLatch(2)表示等待兩個(gè)點(diǎn)完成,即當(dāng)c變成0以后當(dāng)前線程才會(huì)繼續(xù)執(zhí)行后續(xù)代碼,否則由于await()方法,線程會(huì)一直等待;

        而每次調(diào)用countDown()方法則c就會(huì)減一,上述代碼在輸出1,2之后,因?yàn)檎{(diào)用兩次countDown之后c變成0,那么c.await()方法會(huì)失效,然后main()線程執(zhí)行最后輸出3;

        如果我們要等待的是多個(gè)線程的并發(fā)執(zhí)行,則代碼如下

static CountDownLatch c  = new CountDownLatch(2);

public static void main(String[] args) throws InterruptedException {

        Thread thread1 = new Thread(new Runnable() {

@Override

public void run() {

        System.out.println("this is thread 1");

        try {

        Thread.sleep(100l);

        } catch (InterruptedException e) {

        e.printStackTrace();

        }

        c.countDown();

        }

        });

        Thread thread2 = new Thread(new Runnable() {

@Override

public void run() {

        System.out.println("Thread2 is finish");

        c.countDown();

        }

        });

        thread1.start();

        thread2.start();

        c.await();

        System.out.println("all parser finish");

        }

        上述代碼中我們可以保證的是main線程會(huì)等待thread1和thread2線程的執(zhí)行完成,之后再執(zhí)行最后的打印,但是不保證thead1和thread2執(zhí)行的先后順序即有可能thread1先執(zhí)行,也有可能thread2先執(zhí)行;在這一點(diǎn)上有別與join方法,join方法可以保證其是按照調(diào)用順序來(lái)執(zhí)行的。

        注意:在使用CountDownLatch()的過(guò)程中必須保證count次數(shù)大于0,因?yàn)橹挥衏ount次數(shù)大于0才能保證await()方法調(diào)用的阻塞。

        等待多線程完成的CountDownLatch和join()方法的使用就到這里結(jié)束了。

        CyclicBarrier:同步屏障,作用是使得一組線程到達(dá)一個(gè)同步點(diǎn)時(shí)被阻塞,直到所有線程都到達(dá)屏障時(shí),屏障才會(huì)消失,所有被攔截的線程才可以繼續(xù)執(zhí)行。

        CyclicBarrier的使用方式和CountDownLatch類似;實(shí)例代碼如下:

static CyclicBarrier c = new CyclicBarrier(2);

public static void main(String[] args) throws InterruptedException {

        new Thread(new Runnable() {

@Override

public void run() {

        try {

        c.await();

        } catch (Exception e) {

        e.printStackTrace();

        }

        System.out.println(1);

        }

        }).start();

        try {

        c.await();

        } catch (Exception e) {

        e.printStackTrace();

        }

        System.out.println(2);

        }

        上述代碼的執(zhí)行結(jié)果可能是1,2也可能是2,1,c并沒(méi)有保證線程的順序,從目前來(lái)看,CyclicBarrier和CountDownLatch幾乎實(shí)現(xiàn)的是一樣的功能。

        但是CyclicBarrier有更強(qiáng)大的功能,即通過(guò)構(gòu)造函數(shù):new CyclicBarrier(int parties,Runnable barrierAction)來(lái)保證線程到達(dá)同步點(diǎn)的時(shí)候,優(yōu)先執(zhí)行barrierAction中的任務(wù)。實(shí)例代碼如下:

static CyclicBarrier c = new CyclicBarrier(2, new PrThread());

public static void main(String[] args) {

        new Thread(new Runnable() {

@Override

public void run() {

        try {

        c.await();

        } catch (InterruptedException e) {

        e.printStackTrace();

        } catch (BrokenBarrierException e) {

        e.printStackTrace();

        }

        System.out.println(1);

        }

        }).start();

        try {

        c.await();

        } catch (InterruptedException e) {

        e.printStackTrace();

        } catch (BrokenBarrierException e) {

        e.printStackTrace();

        }

        System.out.println(2);

        }

static class PrThread implements Runnable {

    @Override

    public void run() {

        System.out.println(3);

        try {

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

}

其中輸出順序被保證為3,1,2,因?yàn)閏ount設(shè)置為2,所以必須在第一個(gè)線程和線程PrThread執(zhí)行完成之后才能執(zhí)行主線程,完成輸出。

        CyclicBarrier適用于多線程計(jì)算最后合并結(jié)果的場(chǎng)景。

        還有一點(diǎn)就是CountDownLatch()方法只能用一次,而CyclicBarrier可以通過(guò)reset()方法重復(fù)調(diào)用。至于其他方法比如getNumberWaiting可以獲取CyclicBarrier阻塞的線程數(shù)等。

        對(duì)CyclicBarrier的使用到這就結(jié)束了。

        Semaphone:信號(hào)量是用來(lái)控制同時(shí)訪問(wèn)特定資源的線程數(shù)量,以保證合理使用有限的公共資源。常用場(chǎng)景是流量控制。實(shí)例代碼如下:

private static final int THREAD_COUNT = 30;

private static ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_COUNT);

private static Semaphore s = new Semaphore(10);

public static void main(String[] args) {

        for (int i = 0; i

        threadPool.execute(new Runnable() {

@Override

public void run() {

        try {

        s.acquire();

        System.out.println("DO SOMETHING FOR YOURSELF"+s.getQueueLength());

        s.release();

        } catch (InterruptedException e) {

        e.printStackTrace();

        }

        }

        });

        }

        threadPool.shutdown();

        }

        ,其中構(gòu)造線程池大小為30,而在同一時(shí)刻只允許10個(gè)線程執(zhí)行輸出;s.acquire()要求獲取一個(gè)許可,而s.release()表示釋放獲取到的許可,當(dāng)線程數(shù)超過(guò)可用的許可數(shù),則進(jìn)入等待狀態(tài),直到有許可可用,才會(huì)繼續(xù)執(zhí)行下一個(gè)任務(wù)。

        信號(hào)量的使用到這里就結(jié)束了,我們最后再說(shuō)線程間的交換數(shù)據(jù),其實(shí)就是線程之間的數(shù)據(jù)傳遞:

public class ExchangerTest {

    private static final Exchanger exgr = new Exchanger();

    private static ExecutorService threadPool = Executors.newFixedThreadPool(2);

    public static void main(String[] args) {

        threadPool.execute(new Runnable() {

            @Override

            public void run() {

                try {

                    String thread1 = "要交換的數(shù)據(jù)1";

                    exgr.exchange(thread1);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

            }

        });

        threadPool.execute(new Runnable() {

            @Override

            public void run() {

                try {

                    String thread2 = "要交換的數(shù)據(jù)1";

                    String exchange = exgr.exchange("thread2");

                    System.out.println(exchange.equals(thread2));

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

            }

        });

        threadPool.shutdown();

    }

};

其中exchange為從thread1中拿到的要對(duì)比的數(shù)據(jù),然后和thread2做對(duì)比,如果是相當(dāng)則輸出true.

        其中exgr攜帶了需要交互的數(shù)據(jù)信息。

        到此Exchanger的使用結(jié)束。

        并發(fā)編程中用的比較多的就是CountDownLatch和CyclicBarrier和Semaphore。所以了解這些有助于我們以后更好的編程


文章題目:Join,CountDownLatch,CyclicBarrier,Semaphore和Exchanger
新聞來(lái)源:http://weahome.cn/article/jjisgd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部