/* 我的要求是一个线程应该打印偶数,另一个应该打印奇数。这些线程应按顺序打印数字(1、2、3、4、5...)
我已经完成了这段代码,但是当我注解countThreadOdd.Start()或countThreadEven.Start()方法时,它不会只打印偶数或奇数。
class Program
{
static Object locker = new Object();
static LinkedList<int> number = new LinkedList<int>();
static int counter = 0;
static void Main(string[] args)
{
Thread countThreadOdd = new Thread(oddThread);
Thread countThreadEven = new Thread(evenThread);
//Thread Start
countThreadOdd.Start();
countThreadEven.Start();
//main thread will untill below thread is in exection mode
countThreadOdd.Join(10);
countThreadEven.Join(10);
Console.ReadLine();
}
//Odd Thread
public static void oddThread()
{
for (; counter < 10; )
{
//Lock the another thread to enter in critial area
lock (locker)
{
if (counter % 2 != 0)
{
Console.WriteLine(counter);
counter++;
}
}
}
}
//Even Thread
public static void evenThread()
{
for (; counter < 10; )
{
//Lock the another thread to enter in critial area
lock (locker)
{
if (counter % 2 == 0)
{
Console.WriteLine(counter);
counter++;
}
}
}
}
}
6条答案
按热度按时间jq6vz3qz1#
如果你想在两个线程之间交替,你可以使用两个
AutoResetEvent
对象来实现,如下所示:如果只想运行其中一个线程,可以使用
ManualResetEvent
来有效地删除所有锁定。一个完整的例子:
kx7yvsdv2#
您实际上可以使用Interlocked在线程之间进行通信。Interlocked允许您在两个线程之间并发共享一个变量。
fae0ux8s3#
5kgi1eie4#
我们可以使用共享资源(在本例中为整数变量)和Task.Delay(1)来实现这一点,Task.Delay(1)允许循环暂停一段时间。
完整方案:
lqfhib0f5#
试试这个方法。它使用任务库。
uz75evzq6#
使用AutoResetEvent,可以使线程相互等待。在这里,两个线程写入从1到20的数字: