限制正在运行的线程数?

时间:2012-10-24 10:44:57

标签: vb.net multithreading

我继承了下面的一些代码,工作正常,唯一的问题是,我希望能够限制任何时候运行的线程数,此时我有大约8-10个并行运行的作业,我想在任何时候将线程数限制为3或4,这是否可以使用下面的代码而不需要太多更改?

Public Sub threading_Example()

 Dim threadList As New List(Of Thread)

 For n = 0 To numJobs 'about 8-10 normally

     Dim new_job As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf do_Job))
     Dim job As New Job

     'job.stuff = stuff

     newJob.Start(job)
     threadList.Add(new_job)

 Next

 For Each t As Thread In threadList
     t.Join()
 Next

End Sub

Public Sub do_Job(ByVal job As Object)
   'do task 
End Sub

4 个答案:

答案 0 :(得分:0)

我的建议是使用线程池。线程池内置了许多优化功能。例如线程池可以确定机器具有的核心数,并相应地计划线程数。如果创建了更多线程但未正确使用,则线程池将终止其他线程。

考虑使用线程池重构代码。线程池还可以选择限制线程数(但不建议这样做。)

答案 1 :(得分:0)

我建议改用ThreadPool。您可以使用SetMin | MaxThreads方法限制它使用的线程数。

答案 2 :(得分:0)

根据您使用的版本,您可能只需尝试此操作:

Parallel.For(0, 10, 
            (New ParallelOptions() With {.MaxDegreeOfParallelism = 4}), 
             Sub(i As Integer)
                ' do job        
                System.Threading.Thread.Sleep(2000)
                Debug.Print("done no. {0}", i)
             End Sub)

无需任务列表并加入线程

答案 3 :(得分:0)

尝试使用Semaphore例如:

ReadOnly Sem As New Semaphore(3, 4)

    Sub Main()

        Dim threadList As New List(Of Thread)
        Dim numJobs As Integer
        For n = 0 To numJobs

            Dim new_job As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf do_Job))

            new_job.Start()
            threadList.Add(new_job)

        Next

        For Each t As Thread In threadList
            t.Join()
        Next


    End Sub


    Public Sub do_Job(ByVal job As Object)

        Sem.WaitOne()
        'only 3 or 4 threads at time can do task
        Sem.Release()
    End Sub