我必须开发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