.NET에서 QUEUE를 지원하는 클래스로는 (1) Queue 요소들이 object 타입인 System.Collections.Queue 클래스와 (2) 개발자가 Queue 생성 시 요소들의 데이터 타입을 결정할 수 있는 Generic 타입의 System.Collections.Generic.Queu 클래스, 그리고 (3) 멀티쓰레딩 환경에서 Queue를 간편하게 사용할 수 있도록 .NET 4.0부터 제공된 ConcurrentQueue클래스가 있다.
.NET의 QUEUE 클래스와 Queue 클래스는 요소 타입을 지정할 수 있는 Generic인가 아닌가 하는 차이가 있으며, 두 클래스는 내부적으로 원형 동적 배열로 구현되어 있다. 즉, 이들 클래스는 원형배열을 사용하여 Queue를 구현하였는데, Queue 클래스의 디폴트 성장인자는 2.0으로서 배열 확장 시 2배씩 확장해 나간다.
아래예제는 Queue를 사용하여 정수형 Queue를 만들고 데이터를 추가하고 읽어내는 샘플코드다.
static void Main(string[] args)
{
// int 타입의 Queue 생성
Queue<int> q = new Queue<int>();
q.Enqueue(1);
q.Enqueue(2);
q.Enqueue(3);
// 하나를 Dequeue
int data = q.Dequeue();
Console.WriteLine(data);
// 나머지 모두를 Dequeue
foreach (var item in q)
{
Console.WriteLine(item);
}
// int형 Concurrent Queue 생성
var qupid = new ConcurrentQueue<int>();
// Item을 큐에 넣는 작업쓰레드
Task tEnq = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 100; i++)
{
q.Enqueue(i);
Thread.Sleep(50);
}
});
// Item을 큐에서 꺼내는 작업쓰레드
Task tDeq = Task.Factory.StartNew(() =>
{
int result;
for (int i = 0; i < 100; i++)
{
if (q.TryDequeue(out result))
{
Console.WriteLine(result);
Thread.Sleep(100);
}
}
});
// 두 쓰레드가 끝날 때까지 대기
Task.WaitAll(tEnq, tDeq);
}
}