1、交替输出奇数和偶数
internal class Program
{
private static object _locker = new object();
private static int _currentNumber = 0;
private const int MaxNumber = 100;
static void Main()
{
Thread evenThread = new Thread(PrintEven);
Thread oddThread = new Thread(PrintOdd);
evenThread.Start();
oddThread.Start();
evenThread.Join();
oddThread.Join();
}
// 偶数线程
static void PrintEven()
{
while (_currentNumber <= MaxNumber)
{
lock (_locker)
{
// 这个线程不行就等着
while (_currentNumber % 2 != 0)
{
Monitor.Wait(_locker);
}
Console.WriteLine($"Even: {_currentNumber}");
_currentNumber++;
Monitor.Pulse(_locker); // 通知奇数线程
}
}
}
// 奇数线程
static void PrintOdd()
{
while (_currentNumber <= MaxNumber)
{
lock (_locker)
{
// 如果当前是偶数,则等待偶数线程通知
while (_currentNumber % 2 == 0)
{
Monitor.Wait(_locker);
}
Console.WriteLine($"Odd: {_currentNumber}");
_currentNumber++;
Monitor.Pulse(_locker); // 通知偶数线程
}
}
}
}
2、让两个线程A和B将自己的ID轮番写入一个文件中,每个线程重复十次写入后执行一个回调函数,说“I'm OK”
class Program
{
private static readonly object _locker = new object();
private static bool _isThreadATurn = true; // 初始由线程A开始
private static int _writeCountA = 0;
private static int _writeCountB = 0;
private const string FilePath = "output.txt";
static void Main()
{
// 清空或创建文件
File.WriteAllText(FilePath, string.Empty);
Thread threadA = new Thread(() => RunThread("A", () => Console.WriteLine("A: I'm OK")));
Thread threadB = new Thread(() => RunThread("B", () => Console.WriteLine("B: I'm OK")));
threadA.Start();
threadB.Start();
threadA.Join();
threadB.Join();
Console.WriteLine("File content:");
Console.WriteLine(File.ReadAllText(FilePath));
Console.ReadLine();
}
static void RunThread(string id, Action callback)
{
int writeCount = 0;
while (writeCount < 10)
{
lock (_locker)
{
// 检查是否轮到自己
while ((id == "A" && !_isThreadATurn) || (id == "B" && _isThreadATurn))
{
Monitor.Wait(_locker);
}
// 写入文件
File.AppendAllText(FilePath, id);
writeCount++;
// 更新状态并通知对方线程
_isThreadATurn = !_isThreadATurn;
Monitor.Pulse(_locker);
}
}
callback(); // 执行回调
}
}