zoukankan      html  css  js  c++  java
  • 多线程处理文档队列

        public class Document
        {
            public string Title { get; private set; }
            public string Content { get; private set; }
            public Document(string title, string content)
            {
                this.Title = title;
                this.Content = content;
            }
        }

        public class DocumentManager
        {
            private readonly Queue<Document> documentQueue=new Queue<Document>();
            public void AddDocument(Document doc) //添加文档到队列
            {
                lock (this)
                {
                    documentQueue.Enqueue(doc);
                }
            
            }
            public Document GetDocument()     //删除队列到文档
            {
                Document doc = null;
                lock (this)
                {
                    doc=documentQueue.Dequeue();
                }
                return doc;
            }
            public bool IsDocumentAvailable  //队列的文档数
            {
                get
                {
                    return documentQueue.Count > 0;
                }
            }

     public class ProcessDocument
        {
            private DocumentManager documentManager;
            public static void Start(DocumentManager dm)
            {
                new Thread(new ProcessDocument(dm).Run).Start();
            }
            protected ProcessDocument(DocumentManager dm)
            {
                documentManager = dm;
                //Console.WriteLine("初始化完成");
             
            }
            protected void Run()
            {
                while (true)
                {
                    if (documentManager.IsDocumentAvailable)
                    {
                        Document doc = documentManager.GetDocument();   //从队列去文档
                        Console.WriteLine("Processing document从队列中取出文档并删除队列中的文档 {0}", doc.Title);
                        Program.WriteLog(string.Format("Processing document 从队列中取出文档并删除队列中的文档 {0}", doc.Title));
                    }
                    Thread.Sleep(new Random().Next(20));
                  
                   
                }
            }


        }

     class Program
        {
            static void Main(string[] args)
            {
                var dm = new DocumentManager();
                ProcessDocument.Start(dm);
                for (int i = 0; i < 1000; i++)
                {
                    Document doc = new Document(" Doc" + i.ToString(), "content");
                    dm.AddDocument(doc); //添加队列到文档
                    //Stream stream = File.Create("console.out.log");
                    //StreamWriter writer = new StreamWriter(stream);
                    //Console.SetOut(writer);
                    Console.WriteLine("Added document {0}", doc.Title);
                    WriteLog(string.Format("Added document {0}",doc.Title));
                     //WriteLog
                    Console.Title = "队列测试";
                }
              
            }
            public static void WriteLog(string str)
            {
                //string filePath = System.Environment.CurrentDirectory.Replace("bin\Debug","log");
               string  logPath = (AppDomain.CurrentDomain.BaseDirectory+ @"logapplog.txt").Replace("bin\Debug\","");
                //string logPath = AppDomain.CurrentDomain.BaseDirectory + @"logapplog.txt";
              


                    FileStream fs = new FileStream(logPath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);  //若存改文件则将日志插入到文本末尾,创建一个新文件
                    using (StreamWriter sw = new StreamWriter(fs,UnicodeEncoding.UTF8))
                    {
                        //lock (sw)
                        //{
                       
                            sw.WriteLine(str);
                            sw.Close();
                        //}
                    }
                    fs.Close();       
            }
        }

  • 相关阅读:
    如何优雅地「蜗居」?
    TCP三次链接和四次断开
    linux文件系统目录
    Linux sync命令的作用分析
    system()函数
    linux 端口设置结构体 struc
    Linux内核的三种调度策略
    setsid
    Android通过NTP服务器取得UTC标准时间
    fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,"%s",name); fp为文件指针 sprintf(buff,"%s",name); buff为字符数组
  • 原文地址:https://www.cnblogs.com/lykbk/p/fthyfrtghfgh4564565465465.html
Copyright © 2011-2022 走看看