1.两个线程交替打印0~100的奇偶数,此题核心点就是如何控制多线程的执行顺序,执行输出如下效果:
- 偶数线程: 0
- 奇数线程: 1
- 偶数线程: 2
- 奇数线程: 3
- 偶数线程: 4
- 奇数线程: 5
- 偶数线程: 6
- 奇数线程: 7
- 偶数线程: 8 创建线程类 需要引用using System.Threading;
public class TheadWorkTest { private static readonly AutoResetEvent oddAre = new AutoResetEvent(false); private static readonly AutoResetEvent evenAre = new AutoResetEvent(false); public void PrintOddNumer() { oddAre.WaitOne(); for (var i = 0; i < 100; i++) { if (i % 2 != 1) continue; Console.WriteLine(Thread.CurrentThread.Name + ":" + i); evenAre.Set(); oddAre.WaitOne(); } } public void PrintEvenNumber() { for (var i = 0; i < 100; i++) { if (i % 2 != 0) continue; Console.WriteLine(Thread.CurrentThread.Name + ":" + i); //Console.WriteLine($"{Thread.CurrentThread.Name}:{i}"); oddAre.Set(); evenAre.WaitOne(); } } }
在控制台应用程序Main方法中调用
static void Main(string[] args) { var work = new TheadWorkTest(); var thread1 = new Thread(work.PrintOddNumer) { Name = "奇数线程" }; var thread2 = new Thread(work.PrintEvenNumber) { Name = "偶数线程" }; thread1.Start(); thread2.Start(); }
2.启动N个线程并按顺序循环打印0~100,如给定N=3则输出如下效果
- 线程0: 1
- 线程1: 2
- 线程2: 3
- 线程0: 4
- 线程1: 5
- 线程2: 6
- 线程0: 7
- 线程1: 8
- 线程2: 9
1.创建TheadWorkTest类
public class TheadWorkTest
{
public Semaphore[] Semaphores { get; set; }
public static int index;
public void PrintNumber(object c)
{
var i = Convert.ToInt32(c);
var preSemaphore = i == 0 ? Semaphores[Semaphores.Length - 1] : Semaphores[i - 1];
var curSemaphore = Semaphores[i];
while (true)
{
preSemaphore.WaitOne();
Interlocked.Increment(ref index);
if (index > 99)
return;
//Console.WriteLine($"{Thread.CurrentThread.Name}:{index}");
Console.WriteLine(Thread.CurrentThread.Name+":"+index);
curSemaphore.Release();
}
}
}
2.在类ProgramMain方法中调用
public static void PrintNumber(int n = 3)
{
var work = new TheadWorkTest { Semaphores = new Semaphore[n] };
for (var i = 0; i < n; i++)
{
work.Semaphores[i] = new Semaphore(1, 1);
if (i != n - 1)
work.Semaphores[i].WaitOne();
}
for (var i = 0; i < n; i++)
{
new Thread(work.PrintNumber) { Name = "线程" + i }.Start(i);
}
}
static void Main(string[] args)
{
PrintNumber(3);
}