🎨
Andy開發紀錄
  • 關於
    • 自介
  • 設計模式
    • 觀察者模型
    • 有限狀態機
    • 裝飾器模式
  • 其他
    • Scrum敏捷式開發
    • SOLID設計
    • TDD驅動測試開發
    • Event Driven Architecture
    • CQRS命令查詢職責分離
    • Concurrent並行相關
      • Single Thread Execution
      • 共用元件設計
        • CountDownLatchWorkPool
        • IForkWorkService
      • Pattern
        • THREAD-PER-MESSAGE
        • PRODUCER CONSUMER
        • SINGLE THREAD
        • Guarded Suspension 守衛模式
      • IQueue
        • ListQueue
        • BlockQueue
        • OrderBlockQueue
  • 元件設計
    • Sql Help
      • SQL Help Generate
      • StringBuilderGenerator
      • SQL Generate
    • excel工具
    • BDD行為驅動開發
    • 多工設計
      • 多工自動調整Thread數量
    • 常用Design Patten實作
    • Telegram Bot元件
    • 代碼元件
    • HCP API元件
    • 文字解析元件
    • MockitObject
    • 資料驗證元件
    • Zip壓縮工具
    • Sql Code Generate
  • 讀書心得
    • Clean code第一章
  • side project
    • 後端服務
  • IDEA
    • IDEA 外掛推薦
    • IDEA 外掛開發
Powered by GitBook
On this page

Was this helpful?

  1. 其他
  2. Concurrent並行相關
  3. Pattern

SINGLE THREAD

單一執行緒通過,該方式很常使用,類似開關門之類的每次進出僅限一個人,多人可能會造成門口塞爆,因此控管單人員出入是很重要的,此方式就是single thread。

海關安全檢查門哨

每次僅一人進出,檢查完才允許下一個人進入

@Slf4j
public class FlightSecurity {

    private int count = 0;

    private String boardingPass;
    private String idCard;

    public synchronized void  pass(Passenger passenger) {
        try {
            count++;
            this.idCard = passenger.getIdCard();
            TimeUnit.SECONDS.sleep(1);
            this.boardingPass=passenger.getBoardingPass();
            this.check();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            count--;
            log.info("count:{} passenger:{}", count, passenger);

        }

    }

    private void check() {
        if (!StringUtils.equals(boardingPass,idCard)) {
            throw new RuntimeException("no same boardingPass:"+boardingPass+",idCard:"+idCard);
        }
    }

}

@ToString
public class Passenger extends Thread {
    private String boardingPass;
    private String idCard;


    private FlightSecurity flightSecurity;

    public Passenger(String name, String boardingPass, String idCard, FlightSecurity flightSecurity) {
        super(name);
        this.boardingPass = boardingPass;
        this.idCard = idCard;
        this.flightSecurity = flightSecurity;
    }

    @Override
    public void run() {
        flightSecurity.pass(this);
    }


    public String getBoardingPass() {
        return boardingPass;
    }

    public String getIdCard() {
        return idCard;
    }
}
PreviousPRODUCER CONSUMERNextGuarded Suspension 守衛模式

Last updated 2 years ago

Was this helpful?