【IT168 專稿】線程門(thread gate)模式是控制線程併發的一個有效工具,可是不少開發者對它並不熟悉。如同交通訊號燈可讓汽車在十字路口有序通行同樣,線程門能夠根據給定條件阻止或容許線程執行。Obi Ezechukwu在本文中爲咱們介紹了線程門的概念,而後經過一個一個多線程素數生成器告訴咱們如何使用它。java
多線程和併發編程曾經是編程高手們才涉足的領域,可是隨着多核處理器的出現,以及應用程序需求的更復雜,還有javax.util.concurrent包的出現,這種狀況已經發生了變化。如今,企業應用開發者須要瞭解Java語言中不一樣的併發機制和構思。當面臨須要非教科書式、高度創新的併發構思才能解決的問題時,這種需求更顯迫切。這種情形下,僅僅理解Java語言和標準SDK的併發機制已經不能知足須要;你必須可以使用這些工具來編寫程序,實現定製化的併發控制。程序員
在本篇文章中,咱們將瞭解一我的們較少討論的併發模式,一般被稱爲線程門。如同現實世界中門的概念同樣,門實例能夠打開或關閉,從而實現容許或阻止線程執行。它基於某些斷定式的真值來實現這個操做。編程
下面我將大致介紹一下基於通訊流模型的線程門,而後解釋一下如何創建示例應用(一個多線程素數生成器)的開發環境。文章的剩餘部分將經過實例方式讓你瞭解線程門模式。多線程
線程門概述併發
與線程門很是相似的一個例子是運行在不少十字路口的交通訊號燈系統。當紅燈亮的時候,汽車必須停車等候,直到信號改變;當綠燈亮的時候,汽車能夠自由通行。 交通訊號燈被設計用來實現交通的交叉進行,在不須要交叉通行的地方它是沒有用武之地的。對於程序員來講,你能夠把交通訊號燈看做控制器,它可讓雙向交通共享使用同一小部分道路,若是沒有它,交通線路交叉的地方將是一個很是危險的地方。工具
一樣,線程門一般最適合的狀況是:當一個線程集處於激活狀態時,其它線程不能被執行。換句話說,相互競爭的線程集依賴於某些真值斷定式的值,斷定式的每個不一樣的值只觸發一個線程集,而強制其它處於掛起狀態。注意此處的重點是針對一系列或一組線程而並不是單個線程。實際上,咱們關注的重點是多個線程共享訪問一個底層資源的情形,並且這些線程根據對資源所執行的操做,被劃分紅不一樣的集合。線程
很好的一個例子是生產者—消費者(producer-consumer)流程,某些線程負責製造另外一組線程所使用的數據;共享資源最多是不一樣線程集所使用的切換機制(數據總線);而決定線程處理的真值斷定式是數據量。若是數據做爲一個與生產過程相似的流程部分被進行入隊操做,而後該數據被不一樣過程使用或進行出隊操做,一個內存請求隊列有時候可能適合此類模式。設計
生產者-消費者模型是描述線程門概念使用的一個很好例子。對於絕大多數程序員來講,經過一個示例程序或許可以更輕鬆理解一個概念。在本篇文章中,問題還應該是如何輕鬆的實現任務分解和並行操做,由於重點是對其建立一個多線程解決方案。本篇文章的示例應用將實現上述目標。隊列