同步100个线程的输出

时间:2015-07-10 04:21:18

标签: c# multithreading

我有100个线程,我想确保一次最多三个线程按顺序运行它们。

我的数字从1到100.我想打印如下

Thread1
Thread2
thread3
'
'
'

但是一次只允许三个线程。一旦来自1,2,3的任何线程完成。顺序的下一个线程应该开始。

我知道我们可以使用semaphoreslim,但有兴趣知道用Mutex或其他方式回答。

假设我有一个应用程序,一次最多可以服务3个请求。但我收到100个请求,并希望以FIFO顺序为它们提供服务,一次最多3个。希望这清除了疑点,

2 个答案:

答案 0 :(得分:2)

要同时运行最多三个线程,应使用大小为3的线程池。您应该实现一个线程池模式,该模式将执行请求排入FIFO队列,并且最多可以同时执行三个请求。

线程池将保证您的请求开始以相同的顺序执行,因为它使用FIFO队列。但是,这并不能保证他们能够以相同的顺序完成执行。

答案 1 :(得分:0)

你应该省去使用原始线程的痛苦,并选择一个能够为你完成所有难题的框架。

我建议使用Mircosoft的Reactive Framework(NuGet" Rx-Main")。代码非常简单:

var subscription =
    Observable
        .Range(0, 100)
        .Select(n => Observable.Start(() =>
        {
            Thread.Sleep(100);
            return n;
        }))
        .Merge(maxConcurrent: 3)
        .Subscribe(n => Console.WriteLine(n));

使用此代码我得到了这个结果:

1
3
2
0
5
6
7
4
8
9
...
95
97
96
98
99

您可以通过调用subscription.Dispose();停止计算。