2012-10-24 35 views
0

我继承了下面的一些代码,工作正常,唯一的问题是,我希望能够限制在任何时候运行的线程数,此刻我有大约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 

回答

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 
0

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

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

0

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

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) 

无需一个任务列表,并加入线程