Организовать доступ к элементам очереди из двух потоков - 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);
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д