创建定制的泛型类--泛型Queue多线程读写文档--的泛型方法
2008-08-01 10:53
645 查看
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace Generic_T_Manager
{
public interface IDocument
{
string Title
{ get;}
string Content
{ get;}
}
public class Document : IDocument
{
private string title;
public string Title
{
get { return title; }
}
private string content;
public string Content
{
get { return content; }
}
public Document(string title, string content)
{
this.title = title;
this.content = content;
}
}
public interface IDocumentManager<T>
{
void AddDocument(T doc);
T GetDocument();
bool IsDocumentAvailable
{ get;}
}
public class DocumentManager<T> : IDocumentManager<T>
{
Queue<T> documentQueue = new Queue<T>();
public void AddDocument(T doc)
{
lock (this)
{
documentQueue.Enqueue(doc);
}
}
public T GetDocument()
{
T doc;
lock (this)
{
doc = documentQueue.Dequeue();
}
return doc;
}
public bool IsDocumentAvailable
{
get { return documentQueue.Count > 0 ? true : false; }
}
}
//where子句要求泛型类实现一个接口,或派生与某个基类。
//ProcessDocument 独立于Document具体类和DocumentManager具体类
//是通过定义IDocument和IDocumentManager<T>接口来实现的。
//ProcessDocument 改为使用两个泛型类TDocument和TDocumentManager。
//第一个where子句指定TDocument类型必须实现IDocument接口。
//可以用于TDocument的一种类型是Document具体类,因为这个类实现了IDocument接口。
//但是,实现了IDocument接口的其它类也可以用于TDocument。
//TDocumentMananger类型的where子句指定,这个类型必须实现IDocumentManager<TDocument>接口。
//所以在Document用于TDocument时,TDocumentManager必须是一个实现IDocumentMan<Document>的类。
public class ProcessDocument<TDocument, TDocumentManager>
where TDocument:IDocument
where TDocumentManager:IDocumentManager<TDocument>
{
private TDocumentManager documentManager;
protected ProcessDocument(TDocumentManager dm)
{
documentManager = dm;
}
protected void Run()
{
while (true)
{
if (documentManager.IsDocumentAvailable)
{
TDocument doc = documentManager.GetDocument();
Console.WriteLine("Processing document {0}", doc.Title);
}
else
break;
Thread.Sleep(20);
}
}
public static void Start(TDocumentManager dm)
{
new Thread(new ProcessDocument<TDocument, TDocumentManager>(dm).Run).Start();
}
}
class Program
{
static void Main(string[] args)
{
DocumentManager<Document> dm = new DocumentManager<Document>();
ProcessDocument<Document, DocumentManager<Document>>.Start(dm);
for (int i = 0; i < 200; i++)
{
Document d1 = new Document("title" + i.ToString(), "content");
dm.AddDocument(d1);
Console.WriteLine("added docuemnt {0}", d1.Title);
Thread.Sleep(10);
}
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace Generic_T_Manager
{
public interface IDocument
{
string Title
{ get;}
string Content
{ get;}
}
public class Document : IDocument
{
private string title;
public string Title
{
get { return title; }
}
private string content;
public string Content
{
get { return content; }
}
public Document(string title, string content)
{
this.title = title;
this.content = content;
}
}
public interface IDocumentManager<T>
{
void AddDocument(T doc);
T GetDocument();
bool IsDocumentAvailable
{ get;}
}
public class DocumentManager<T> : IDocumentManager<T>
{
Queue<T> documentQueue = new Queue<T>();
public void AddDocument(T doc)
{
lock (this)
{
documentQueue.Enqueue(doc);
}
}
public T GetDocument()
{
T doc;
lock (this)
{
doc = documentQueue.Dequeue();
}
return doc;
}
public bool IsDocumentAvailable
{
get { return documentQueue.Count > 0 ? true : false; }
}
}
//where子句要求泛型类实现一个接口,或派生与某个基类。
//ProcessDocument 独立于Document具体类和DocumentManager具体类
//是通过定义IDocument和IDocumentManager<T>接口来实现的。
//ProcessDocument 改为使用两个泛型类TDocument和TDocumentManager。
//第一个where子句指定TDocument类型必须实现IDocument接口。
//可以用于TDocument的一种类型是Document具体类,因为这个类实现了IDocument接口。
//但是,实现了IDocument接口的其它类也可以用于TDocument。
//TDocumentMananger类型的where子句指定,这个类型必须实现IDocumentManager<TDocument>接口。
//所以在Document用于TDocument时,TDocumentManager必须是一个实现IDocumentMan<Document>的类。
public class ProcessDocument<TDocument, TDocumentManager>
where TDocument:IDocument
where TDocumentManager:IDocumentManager<TDocument>
{
private TDocumentManager documentManager;
protected ProcessDocument(TDocumentManager dm)
{
documentManager = dm;
}
protected void Run()
{
while (true)
{
if (documentManager.IsDocumentAvailable)
{
TDocument doc = documentManager.GetDocument();
Console.WriteLine("Processing document {0}", doc.Title);
}
else
break;
Thread.Sleep(20);
}
}
public static void Start(TDocumentManager dm)
{
new Thread(new ProcessDocument<TDocument, TDocumentManager>(dm).Run).Start();
}
}
class Program
{
static void Main(string[] args)
{
DocumentManager<Document> dm = new DocumentManager<Document>();
ProcessDocument<Document, DocumentManager<Document>>.Start(dm);
for (int i = 0; i < 200; i++)
{
Document d1 = new Document("title" + i.ToString(), "content");
dm.AddDocument(d1);
Console.WriteLine("added docuemnt {0}", d1.Title);
Thread.Sleep(10);
}
}
}
}
相关文章推荐
- 创建定制的泛型类--泛型Queue多线程读写文档--的泛型方法
- 通过GCD、NSOperationQueue队列、NSThread三种方法来创建多线程
- 多线程创建 方法二:NSOperation & NSOperationQueue
- 泛型(泛型类,泛型方法)及字典
- 黑马程序员——自学笔记10(多线程及其创建方法)
- C#进行文件读写、创建、复制、移动、删除的方法
- [java多线程]创建线程的两个方法
- C#中关于创建定制的泛型类的例子
- C#操作Excel(创建、打开、读写、保存)几种方法的总结
- Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限
- 泛型(Generic):了解泛型、泛型的应用、?通配符和泛型的限定、泛型方法和类型推断、泛型类、用反射获得实际
- C#实现通过模板自动创建Word文档的方法
- Java中的泛型类和泛型方法区别和联系
- Python并发编程之创建多线程的几种方法(二)
- Java Notes: Java的多线程创建的两种方法以及Race Condition的解释
- 黑马程序员_学习日记65_713ASP.NET(委托、托管、扩展方法、泛型委托、进程_应用程序域_线程、多线程、异步委托)
- 泛型方法或泛型类中的方法是内部调用、PInvoke 或是在 COM 导入类中定义的。
- C#操作Excel(创建、打开、读写、保存)几种方法的总结
- Java6学习笔记55——多线程编程——线程的创建方法1
- Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例