生產者-消費者模式是多線程應用程序開發中最常用的構造之一,但也因此而變得複雜。因為在一個應用程序中可以多次重複生產者-消費者行為,其代碼也會隨之重複。軟件開發人員Ze'ev Bubis和Saffi Hartal創建了Consumer類,該類通過在多線程應用程序中促進代碼重用以及簡化代碼調試和維護來解決這個問題。
多線程是一種使應用程序能同時處理多個操作的編程技術。通常有兩種類型的多線程操作:
適時事件的示例包括程序提醒、超時事件以及諸如輪詢和刷新之類的重複性操作。後台處理的示例包括等待發送的包或等待處理的已接收的消息。
生產者-消費者方案很適合於後台處理類別的情況。這些情況通常圍繞一個作業「生產者」方和一個作業「消費者」方。在大多數情況下,對於使用同一資源的作業,應以「先來先服務」的方式按順序處理,這可以通過使用單線程的消費者輕松實現。
要啟用標準消費者,當作業到來時創建一個作業隊列來存儲所有作業。生產者線程通過將新對象添加到消費者隊列來交付這個要處理的新對象。然後消費者線程從隊列取出每個對象,並依次處理。當隊列為空時,消費者進入休眠。當新的對象添加到空隊列時,消費者會醒來並處理該對象。
因為生產者-消費者方案很常用,所以在構建應用程序時它可能會出現幾次,這導致了代碼重複。當第一次需要生產者-消費者行為時,通過編寫一個採用一個線程和一個隊列的類來實現該行為。當第二次需要這種行為時,開發人員著手從頭開始實現它,但隨後認識到以前已經做過這件事了。代碼被複製並修改了處理對象的方式。當第三次在該應用程序中實現生產者-消費者行為時,很明顯代碼重複太多了。因此需要一個通用的Consumer類,它將處理所有的生產者-消費者方案。
Consumer類的創建目的是:在應用程序中消除代碼重複——為每個生產者-消費者實例編寫一個新作業隊列和消費者線程。有了合適的Consumer類,開發人員只需編寫專門用於作業處理(業務邏輯)的代碼。這使得代碼更清晰、更易於維護以及更改起來更靈活。
Consumer類的核心需求:
多線程應用程序通常利用生產者-消費者編程方案,其中由生產者線程創建重複性作業,將其傳遞給作業隊列,然後由消費者線程處理作業。雖然這種編程方法很有用,但是它通常導致重複的代碼,這對於調試和維護可能是真正的問題。Consumer類的出現正是為了解決這個問題。