Вот вопрос:
Скажем, есть 3 списка l1, l2 и l3 одинаковой длины. Три потока обращаются к трем спискам. Произнесите T1 -> l1, T2 -> l2 и T3 -> l3. Он должен печатать в порядке, скажем, первый элемент 1-го списка, затем первый элемент 2-го списка, а затем первый элемент 3-го списка. Затем второй элемент 1-го, затем второй элемент 2-го списка, а затем второй элемент 3-го списка.
Что я пробовал:
private static readonly Object obj = new Object();
static List<string> list1 = new List<string> { "1", "2", "3", "4" };
static List<string> list2 = new List<string> { "a", "b", "c", "d" };
static List<string> list3 = new List<string> { "*", "+", "-", "?" };
static int i = 0;
static void Main(string[] args)
{
Thread t1 = new Thread(() => PrintItem());
t1.Name = "Print1";
Thread t2 = new Thread(() => PrintItem());
t2.Name = "Print2";
Thread t3 = new Thread(() => PrintItem());
t3.Name = "Print3";
t1.Start();
t2.Start();
t3.Start();
t1.Join();
t2.Join();
t3.Join();
Console.Read();
}
private static void PrintItem()
{
while (true)
{
lock (obj)
{
if (i >= list1.Count)
break;
Console.WriteLine(Thread.CurrentThread.Name + " " + list1[i]);
Console.WriteLine(Thread.CurrentThread.Name + " " + list2[i]);
Console.WriteLine(Thread.CurrentThread.Name + " " + list3[i]);
i++;
}
}
}
Вывод правильный, но он не использует три потока. Исправьте код пожалуйста.