造轮子:线程的小用

厂址:http://www.cnblogs.com/sandy_liao/archive/2010/11/29/1891533.html

在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。

这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。

代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;

/// <summary>
/// 在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
///
///这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
///作者:周公
/// 时间:2008-5-17
/// 原发地址:http://blog.csdn.net/zhoufoxcn
/// </summary>
public class ThreadDemo
{
    private Thread[] threads;
    private int thrs = 5;
    private ArrayList stringList;
    private event EventHandler OnNumberClear;//数据删除完成引发的事件
    public static void Main()
    {
        ThreadDemo demo = new ThreadDemo(100);
        demo.Action();
    }
    public ThreadDemo(int number)
    {
        Random random = new Random(1000000);
        stringList = new ArrayList(number);
        for (int i = 0; i < number; i++)
        {
            stringList.Add(i.ToString());
        }
        threads = new Thread[thrs];
        for (int i = 0; i < thrs; i++)
        {
            threads[i] = new Thread(new ThreadStart(Run));
            threads[i].Name = "线程" + (i + 1);
        }
        OnNumberClear += new EventHandler(ThreadDemo_OnNumberClear);

    }
    /// <summary>
    /// 开始工作
    /// </summary>
    public void Action()
    {
        for (int i = 0; i < thrs; i++)
        {
            threads[i].Start();
        }
    }
    /// <summary>
    /// 共同做的工作
    /// </summary>
    private void Run()
    {
        string stringValue = null;
        while (true)
        {
            Monitor.Enter(this);//锁定,保持同步
            stringValue = (string)stringList[0];
            Console.WriteLine(Thread.CurrentThread.Name + "删除了" + stringValue);
            stringList.RemoveAt(0);//删除ArrayList中的元素
            if (stringList.Count == 0)
            {
                OnNumberClear(this, new EventArgs());//引发完成事件
            }
            Monitor.Exit(this);//取消锁定
            Thread.Sleep(5);
        }
    }

    //执行完成之后,停止所有线程
    void ThreadDemo_OnNumberClear(object sender, EventArgs e)
    {
        Console.WriteLine("执行完了,停止了所有线程的执行。");
        for (int i = 0; i < thrs; i++)
        {
            threads[i].Abort();
        }
    }
}
 

用例:

using PMS.DBEntity;
using System;
using System.Web;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;

namespace PMS.Convert.PDF
{
    public struct FileInfo
    {
        public int fileid;
        public string filepath;
    }

    public class ConvertSwf
    {
        static Queue<FileInfo> filelist = new Queue<FileInfo>();
        private static string rootpath = HttpContext.Current.Server.MapPath("~/");
        private static Thread t = null;
        private static string conn = "";
        public static void LoadQueue(int classid, string _conn)
        {
            conn = _conn;
            using (var entity = new PMSEntities(conn))
            {
                DALContent dal = new DALContent();
                var fileinfo = (from p in entity.jcms_normal_content
                                where p.ClassId == classid && p.IsPass == 1 && p.CustomField05.Substring(0, 10) == "pdf" && p.CustomField03 != null
                                select p);

                if (!fileinfo.Any())
                {
                    return;
                }
                foreach (var item in fileinfo)
                {
                    filelist.Enqueue(new FileInfo { fileid = item.Id, filepath = rootpath + "" + item.CustomField03.Remove(0, 1) });
                    item.CustomField05 = "convet";
                }
                entity.SaveChanges();
            }
        }
        public static void ExecTreade()
        {
            try
            {
                if (t == null)
                {
                    t = new Thread(Run);
                    t.Start();
                }
                if (!t.IsAlive)
                {
                    t = new Thread(Run);
                    t.Start();
                }
            }
            catch (Exception)
            {

                throw;
            }

        }

        public static string sourcefile = "";
        static string outfile = "";
        static void Run()
        {
            Pdf2Swf pdf2swf = new Pdf2Swf();
            string saveName = "";
            string extension = "";
            string outfile = "";
            int id = 0;
            using (var entity = new PMSEntities(conn))
            {
                while (filelist.Count > 0)
                {
                    FileInfo f = filelist.Dequeue(); ;
                    sourcefile = f.filepath;
                    id = f.fileid;
                    saveName = Path.GetFileName(sourcefile);
                    extension = Path.GetExtension(sourcefile).ToLower();
                    saveName = saveName.Substring(0, saveName.Length - extension.Length);
                    outfile = Path.GetDirectoryName(sourcefile) + "/" + saveName + "_%.swf";
                    try
                    {
                        pdf2swf.PDFConvertToSWF(sourcefile, outfile);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                        continue;
                    }
                    var content = entity.jcms_normal_content.SingleOrDefault(p => p.Id == id);
                    if (File.Exists(outfile.Replace("_%", "_1")))
                    {
                        content.CustomField04 = "/" + outfile.Replace(rootpath, "").Replace("_%", "_[*,0]");
                        content.CustomField05 = "complete";
                        entity.SaveChanges();
                    }
                    else
                    {
                        content.CustomField04 = "";
                        content.CustomField05 = "error";
                        entity.SaveChanges();
                    }
                }
            }

            t.Abort();

        }
    }
}
时间: 2024-10-22 01:16:34

造轮子:线程的小用的相关文章

【小程序】实现复用及造轮子入门

?小程序实现可以通过 template 和 component 两种方式实现代码的复用,以减少不必要的工作量.template 被官方称为模块,在 xml 和 css 中定义代码片段,然后可以在其他页面使用,事实上,template 像是复制粘贴的另一种形式,只是把复制粘贴的操作使用<template> 标签来代替,减少了页面的简洁程度,方便维护(有点像 android 中的 <include> ).比起template, component 实现的自定义组件,可以进行自己的逻辑处

我为什么要造一个轮子——GNova开发小计

GNova最初叫做CSystem,是作为系统库来设计的. 我最初学习C++是在大学时期的专业课,学生时代也曾用C++写过一些算法,但项目和比赛一般是用C#和Java完成的.工作之后,由于项目需要,我们的业务平台需要使用C++进行编写.在当时,我总是认为C++的标准库SL不如Java的lang包和.Net的System库好用,再加上当时接触到了Qt的Core模块,以及项目合作单位自己的基础库封装,于是我渐渐萌生了编写一套属于自己的好用的基础库的想法,CSystem也就应运而生. 现在看来,当时的想

【造轮子系列】转轮选择工具——WheelView

实现转轮的选择功能,效果见下图: 本项目是由这个项目修改而成,不过基本上除了原来的大体框架以外,内部的实现逻辑全都做了大量修改,各位看官可以对比参考,在此必须感谢原作者给我的启发. 先上源码:WheelView 实现一个自定义View最基本步骤有: * 设计attribute属性 * 实现构造函数,在构造函数中读取attribute属性并使用 * 重写onMeasure方法 * 重写onDraw方法 这些基础的部分就不细说了,如果对这部分不了解的,可以看看我之前的一篇文章,也可以直接从源码找答案

重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)

一说到写日志,大家可能推荐一堆的开源日志框架,如:Log4Net.NLog,这些日志框架确实也不错,比较强大也比较灵活,但也正因为又强大又灵活,导致我们使用他们时需要引用一些DLL,同时还要学习各种用法及配置文件,这对于有些小工具.小程序.小网站来说,有点“杀鸡焉俺用牛刀”的感觉,而且如果对这些日志框架不了解,可能输出来的日志性能或效果未毕是与自己所想的,鉴于这几个原因,我自己重复造轮子,编写了一个轻量级的异步写日志的实用工具类(LogAsyncWriter),这个类还是比较简单的,实现思路也很

我们为什么喜欢重新造轮子

不要重新造轮子,是英文don't re invite wheel的直译.什么是轮子呢,我们一般认为一个通用中间件或框架,和实际业务没有直接关系的代码,就是轮子.这些代码虽然不是实质的业务逻辑,但是在一个项目中往往是担当骨架的作用. 程序员新手的眼中,这些代码就是经验的象征.在很多项目组中,只有经验丰富的老程序员才有机会去设计和选择这些轮子.可以设计可重用的干货代码,也就成为很多对技术有追求的程序员的努力方向.有几年工作经验,在技术上寻求发展的程序员大多都会自己设计和实现一些经典的轮子,这也成为了

【造轮子系列】转轮选择工具——WheelView的改进

在[造轮子系列]转轮选择工具--WheelView中,我详细记录了这个自定义控件的设计思路和相关数据的计算.由于本人能力有限,当时还留下了一些不足的地方,主要包括: 滑动的性能和流畅性有待提高,特别是快速滑动时的效果 没有实现循环滚动的效果 经过这一段时间的不断改进,现在基本上已经比较完美了,接近ios闹钟的滚轮时间选择器的效果了.下面结合代码,对比之前的版本,记录一下我做的这些改进. 效果图 源码 WheelView 核心计算思想的转变 性能优化说白了就是在得到相同结果的前提下进行最少的计算.

程序员为什么热衷造轮子

搜索一下"造轮子"或者"程序员为什么喜欢造轮子",会看到很多相关的讨论,这是个老生常谈的话题,很多人谈过了,谈了很多年.不过还是有再谈的必要. "造轮子"的含义: 明知道你做的不可能比前辈做得更好,却仍然坚持要做. 就软件开发而言,"造轮子"是指,"业界已经有公认的软件或者库了,却还坚持要自己做". 在软件开发过程中,有时你想造轮子老板却极力反对,有时你不想造轮子老板却坚持要造一个出来,为什么会有这种两极状

程序员为什么热衷造轮子?

搜索一下“造轮子”或者“程序员为什么喜欢造轮子”,会看到很多相关的讨论,这是个老生常谈的话题,很多人谈过了,谈了很多年.不过还是有再谈的必要. “造轮子”的含义: 明知道你做的不可能比前辈做得更好,却仍然坚持要做. 就软件开发而言,“造轮子”是指,“业界已经有公认的软件或者库了,却还坚持要自己做”. 在软件开发过程中,有时你想造轮子老板却极力反对,有时你不想造轮子老板却坚持要造一个出来,为什么会有这种两极状况? 这篇文章就来讨论“造轮子”这件事,包括下列主题: 程序员为什么会重复造轮子 为什么有

谈谈自己造轮子

写下这篇文章,主要是对我近段时间工作的反思. 为啥要造轮子 对于一些程序员来说,喜欢自己造轮子可算是一个很平常的事情,我想可能有如下原因: 对于一些小的功能,不需要借助外部库,直接能够自己写完搞定. 对于一些大的功能,很多外部库不能很好的与自己项目整合,有时候还不如自己写一个. 有时候即使能用的外部库,因为程序员相轻的思想,就觉得自己写的nb,不用. 还有可能就是想深入学习某一个知识点,自己动手造一个. 我不觉得造轮子不好,曾今很长一段时间我都认为造轮子是体现自己能力很好的一种方式,但是现在越来

万树IT:Spring Batch批处理框架技巧,让你不再重复造轮子

整理了Spring批处理框架的内容,掌握这些知识,可以帮你省去一些造轮子的过程,提高开发效率.本文由博主姚兆峰分享,小编整理后推送,希望对你的工作有帮助. Part.1 问题分析 在大型的企业应用中,或多或少都会存在大量的任务需要处理,如邮件批量通知所有将要过期的会员等等.而在批量处理任务的过程中,又需要注意很多细节,如任务异常.性能瓶颈等等.那么,使用一款优秀的框架总比我们自己重复地造轮子要好得多一些. AD 我所在的物联网云平台部门就有这么一个需求,需要实现批量下发命令给百万设备.为了防止枯