1. 程式人生 > >【學習筆記】Java-Concurrent-Semaphore

【學習筆記】Java-Concurrent-Semaphore

 

同時只有一個人可以吃麵包的示例

    /**
     * 第一個執行緒 與第二個同時執行
     */
    public static void firstThread0(Context context) throws Exception{
        while(true) {
            eatBread(context);
            Thread.sleep(1000); //每吃一個麵包休息一秒
        }
    }

    /**
     * 第二個執行緒
     */
    public static void secondThread0(Context context) throws Exception{
        while(true) {
            eatBread(context);
            Thread.sleep(1000);
        }
    }

    public static void eatBread(Context context) throws Exception {
        //請求分配一個麵包
        context.breadDispatcher.acquire(1);
        log("我吃了一個麵包");
        //把座位還回去
        context.breadDispatcher.release();
    }

    public static void log(String args){
        System.out.println(Thread.currentThread().getName() + "\t" + new Date() + "\t" + args);
    }

    public static class Context {
        //這裡使用一個遵守FIFO規則的Semaphore
        //來看看cpu時間片的分配演算法會讓誰先吃到第一個麵包
        public Semaphore breadDispatcher = new Semaphore(1, true);

        public Context() {

        }
    }

執行結果:

Thread-1    Mon Nov 05 15:46:08 CST 2018    我吃了一個麵包
Thread-0    Mon Nov 05 15:46:08 CST 2018    我吃了一個麵包
Thread-1    Mon Nov 05 15:46:09 CST 2018    我吃了一個麵包
Thread-0    Mon Nov 05 15:46:09 CST 2018    我吃了一個麵包

用途:

1.為容器設定邊界

2.設定同時執行某個操作的最大執行緒數量

常用函式

//if(還有許可證) 取走許可證 else 阻塞等待可用許可證

public void acquire() throws InterruptedException

//歸還一個許可證

public void release()