ExecutorService + synchronized + 對象所 實現生產者消費者模式

package Demo06_Productor_Consumer;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Room {
    public int count = 0;
}

public class Main {
    public static Room r = new Room();

    public static int N = 100000;

    public static ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 5);

    public static void main(String[] args) {
        // 生產者1
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    for (int i = 0; i < N; i++) {
                        synchronized (r) {
                            r.count++;
                        }

                    }
                } catch (Exception e) {

                }

                System.out.println("addEnd");
            }
        });

        // 生產者2
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < N; i++) {
                    synchronized (r) {
                        r.count++;
                    }
                }

                System.out.println("addEnd");
            }
        });

        // 消費者1
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 2 * N; i++) {
                    synchronized (r) {
                        r.count--;
                    }
                }

                System.out.println("subEnd");
            }
        });

        // 1s後檢查結果
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println("final count=" + r.count);
            }
        });

        // 關閉線程池
        executorService.shutdown();
    }
}

/*
addEnd
addEnd
subEnd
final count=0
 */

思考:

考慮到結合netty做業務,最終每一個請求都會被包裝爲task扔到線程池計算,

以房間類遊戲爲例子,每個人的請求最終要映射到具體操作哪一個房間對象,所以這個demo構建以Room作爲互斥對象,

然後每個人都進行操作,最終發現通過 synchronized 輕鬆寫出邏輯正確線程安全,可讀性強的代碼,這點可讀性感覺比go的強!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章