亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

JAVA為我們提供了一些效果非常不錯的并發(fā)工具類,這里主要介紹一下如下幾個工具類的使用,并不會去深究實現(xiàn)原理(其實原理都是通過自旋CAS,CAS對應(yīng)的處理器原子操作指令是CMPXCHG)。

Semaphore
CountDownLatch
CyclicBarrier
Executors

一、Semaphore

1、作用

設(shè)定信號量,只有獲得信號量的線程才能夠往后執(zhí)行業(yè)務(wù)邏輯,沒有獲得信號量的線程只能阻塞等待喚醒重新嘗試獲得信號量,可用于服務(wù)限流。

2、代碼示例

/**
 * Semaphore作用:設(shè)定信號量,只有獲得信號量的線程才能夠往后執(zhí)行業(yè)務(wù)邏輯,
 * 沒有獲得信號量的線程只能阻塞等待喚醒重新嘗試獲得信號量,可用于服務(wù)限流
 * @author 愛吃魚的烏賊
 */
public class SemaphoreTest {

    public static void main(String[] args) {
        //設(shè)定信號量,只允許2個線程同時處理
        Semaphore semaphore = new Semaphore(2);
        for(int i=0;i<10;i++) {
            new Thread(new Runnable() {
                public void run() {
                    try {
                        //獲取信號量
                        semaphore.acquire();
                        System.out.println("Thread:"+Thread.currentThread().getId()+"獲得信號量"+new Date());
                        Thread.sleep(5000);
                        System.out.println("Thread:"+Thread.currentThread().getId()+"釋放信號量"+new Date());
                        semaphore.release();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }

}

二、CountDownLatch

1、作用

能夠使一個線程等待其他線程完成各自的工作后再執(zhí)行

2、代碼示例

/**
 * CountDownLatch 能夠使一個線程等待其他線程完成各自的工作后再執(zhí)行
 * @author 愛吃魚的烏賊
 */
public class CountDownLatchTest {

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(2);
        new Task1(countDownLatch).start();
        new Task2(countDownLatch).start();
        countDownLatch.await();
        System.out.println("起鍋燒油");
    }
    public static  class Task1 extends Thread{
        CountDownLatch countDownLatch;
        public Task1(CountDownLatch countDownLatch) {
            this.countDownLatch = countDownLatch;
        }

        @Override
        public void run() {
            System.out.println("正在洗菜中....");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("菜已洗好!");
            countDownLatch.countDown();
        }
    } 
    public static class Task2 extends Thread{
        CountDownLatch countDownLatch;
        public Task2(CountDownLatch countDownLatch) {
            this.countDownLatch = countDownLatch;
        }
        @Override
        public void run() {
            System.out.println("正在煮飯中....");
            try {
                Thread.sleep(6000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("飯已煮好!");
            countDownLatch.countDown();
        }
    } 

}

三、CyclicBarrier

1、作用

柵欄屏障,讓一組線程到達(dá)一個屏障(也可以叫同步點)時被阻塞,直到最后一個線程到達(dá)屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續(xù)運行。

2、代碼示例

/**
 *  CyclicBarrier 柵欄屏障,讓一組線程到達(dá)一個屏障(也可以叫同步點)時被阻塞,
 * 直到最后一個線程到達(dá)屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續(xù)運行。
 * @author 愛吃魚的烏賊
 */
public class CyclicBarrierTest {

    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier =new CyclicBarrier(10);
        for(int i=0;i<10;i++) {
            new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(new Random().nextInt(1000)+1000);
                        System.out.println("Thread:"+Thread.currentThread().getId()+"已經(jīng)準(zhǔn)備好");
                        cyclicBarrier.await();
                        System.out.println("Thread:"+Thread.currentThread().getId()+"開始出發(fā)");
                    } catch (Exception e) {
                                e.printStackTrace();
                    }
                }
            }).start();
        }

    }

}

四、Executors

1、作用

主要用來創(chuàng)建線程池,代理了線程池的創(chuàng)建,使得你的創(chuàng)建入口參數(shù)變得簡單

  • newCachedThreadPool創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
  • newFixedThreadPool 創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待。
  • newScheduledThreadPool 創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)執(zhí)行。
  • newSingleThreadExecutor 創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO,LIFO, 優(yōu)先級)執(zhí)行。

2、代碼示例

/**
 * Executors:主要用來創(chuàng)建線程池,代理了線程池的創(chuàng)建,使得你的創(chuàng)建入口參數(shù)變得簡單
 * @author 愛吃魚的烏賊
 */
public class ExecutorsTest {

    public static void main(String[] args) {
        // 1、newCachedThreadPool創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            cachedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    // 這里會發(fā)現(xiàn)結(jié)果有重復(fù)的線程ID
                    System.out.println("Thread:" + Thread.currentThread().getId() + ";newCachedThreadPool");
                }
            });
        }

        // 2、newFixedThreadPool 創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待。
        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);
        for (int i = 0; i < 10; i++) {
            newFixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    // 這里會發(fā)現(xiàn)兩個兩個執(zhí)行完后才繼續(xù)執(zhí)行,并且線程ID不變
                    System.out.println("Thread:" + Thread.currentThread().getId() + ";newFixedThreadPool");
                }
            });
        }

        // 3、newScheduledThreadPool 創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)執(zhí)行。
        ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(2);
        // 延遲3秒鐘后執(zhí)行任務(wù)
        newScheduledThreadPool.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("運行時間: " + new Date());
            }
        }, 3, TimeUnit.SECONDS);

        // 延遲1秒鐘后每隔3秒執(zhí)行一次任務(wù)
        newScheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("運行時間: " + new Date());
            }
        }, 1, 3, TimeUnit.SECONDS);


        // 4、newSingleThreadExecutor 創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。
        ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            newSingleThreadExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    // 這里會發(fā)現(xiàn)結(jié)果有重復(fù)的線程ID
                    System.out.println("Thread:" + Thread.currentThread().getId() + ";newSingleThreadExecutor");
                }
            });
        }
    }
}

分享到:
標(biāo)簽:Java
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定