Организовать доступ к элементам очереди из двух потоков - C#
Формулировка задачи:
1 поток добавляет элементы в очередь. 2 дргуих должны счиать кждый элемент очереди. Как наилучшим образом организовать считываение элементов из очереди в 2-х поток, чтобы каждый (неизвестно, какой раньше) получил элемен и он был бы удалён.
Решение задачи: «Организовать доступ к элементам очереди из двух потоков»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Queue_Test {
class Program {
static Queue<int> objQueue = new Queue<int>();
static object locker = new object();
static Random r = new Random();
static void Main(string[] args) {
Thread addThread = new Thread(AddItems);
Thread GetThread_1 = new Thread(DeueueAndDeleteItem);
Thread GetThread_2 = new Thread(DeueueAndDeleteItem);
addThread.Start();
GetThread_1.Start();
GetThread_2.Start();
Console.ReadLine();
}
static void DeueueAndDeleteItem() {
bool needTodelete = false;
while (objQueue.Count!=0) {
lock (locker) {
int item = 0;
if (needTodelete) {
item = objQueue.Dequeue();
needTodelete = false;
Console.WriteLine("Item {0} dequeued", item);
}
else {
item = objQueue.Peek();
needTodelete = true;
Console.WriteLine("Item {0} peeked!", item);
}
}
Thread.Sleep(200);
}
}
static void AddItems() {
while (true) {
int item = r.Next(0, 101);
lock (locker) {
objQueue.Enqueue(item);
}
Thread.Sleep(50);
Console.WriteLine("Item {0} enqueued!", item);
}
}
}
}