我必須開發Windows服務,它將文件複製到不同的服務器。 所以我必須使用多主題來完成這項任務。 但我必須開始只有3-4線程。 因此,每當一個線程完成後,我必須開始新的線程,以便線程數應保持3或4. 那麼我怎麼能申請檢查呢? 請提供一些相關信息。如何在前一個線程完成後立即啓動新線程?
回答
這可能會給你一個出發點。這個想法是使用一個阻塞隊列,它將阻止出隊操作,直到一個項目可用。所以你的工作線程會圍繞無限循環旋轉,等待項目出現在隊列中。您的主線程會將這些項目排入隊列。以下示例使用.NET 4.0 BCL中的BlockingCollection類。如果這不適用於您,則可以從Stephen Toub's blog獲得阻塞隊列的實現。
Module Example
Private m_Queue As BlockingCollection(Of String) = New BlockingCollection(Of String)
Sub Main()
Dim threads(4) As Thread
For i As Integer = 0 To threads.Length - 1
threads(i) = New Thread(AddressOf Consumer)
threads(i).IsBackground = True
threads(i).Start()
Next
Dim files As IEnumerable(Of String) = GetFilesToCopy()
For Each filePath As String In files
m_Queue.Add(filePath)
Next
End Sub
Sub Consumer()
Do While True
Dim filePath As String = m_Queue.Take()
' Process the file here.
Loop
End Sub
End Module
我不知道VB,但我知道的所有其他語言都有這種操作:join()。
int main(){
threadA.start();
threadA.join(); //here main() wait threadA end
threadB.start(); //what you want
}
對不起,not_vb。我寫了它,因爲我期望VB中具有相同名稱的相同函數。
爲什麼不重用線程而不是產生新線程? 除此之外,看看一個稱爲生產者/消費者隊列的模式。你生產者增加了文件(其路徑信息),消費者閱讀,並採取適當的行動(執行復制操作)
創建一個線程確實有可測量的開銷。即使使用ThreadPool,我發現。 – 2010-07-23 11:56:07
即使是一個小小的節約也能節省一點,特別是當你免費得到它的時候。 我發現爲相同的(或重複的任務)重複使用線程使應用程序更容易調試。特別是當你需要連接windbg時。 – MaLio 2010-07-23 12:21:13
在.NET 4.0中,這是很容易做到的任務:
Dim a As new Task(AdressOf doWork).ContinueWith(AdressOf doOtherWork)
見here更多示例(在C#中)。
- 1. Glib:如何啓動一個新的線程,直到另一個線程完成?
- 2. 如何使線程等到另一個線程完成啓動
- 3. ThreadPool不立即啓動新線程
- 4. 主題:如何在線程完成後重新啓動?
- 5. Java - 在當前線程完成時啓動線程
- 6. 啓動一個線程以前完成其工作之前
- 7. 如何確保線程在另一個線程之前啓動?
- 8. 在新線程中啓動Sinatra應用程序。該線程立即死亡
- 9. 立即運行一個新線程
- 10. ManagedThreadFactory不會立即啓動線程
- 11. 線程和按鈕:如何在完成運行後重新啓動程序
- 12. 如何在完成另一個線程後運行一個線程
- 13. java多線程 - 子線程不會立即啓動
- 14. 立即更新UI線程
- 15. 在一些子線程完成之前,如何讓一個Java線程返回?
- 16. 如何在第一個活動完成後纔開始線程?
- 17. 如何在Java中啓動更多之前等待一個線程完成
- 18. 如何掛起一個線程另一個線程完成其工作之前
- 19. 線程在對象被釋放後立即啓動
- 20. 如何獨立完成Python線程? (WinPDB)
- 21. 我可以等待一個特定的後臺線程完成,然後另一個後臺線程啓動?
- 22. JMeter:如何在第一個線程完成後運行兩個線程
- 23. 如何等待線程在另一個線程以Java/Android啓動之前完成?
- 24. 完全啓動後立即在iPad上啓動應用程序
- 25. 有一個線程啓動另一個線程,然後死
- 26. 在servlet中啓動一個新線程
- 27. 如何強制一個線程在另一個之前啓動?
- 28. C++ 11個線程:如何啓動線程,並單獨檢查其完成?
- 29. 如何確保一個線程在其主線程完成後執行?
- 30. 線程服務。如何在延遲後重新啓動一些線程?
你必須在第三個線程中這樣做,所以你不要阻塞主要的。 – 2010-07-23 12:09:11