`

多线程执行多任务的DEMO

阅读更多

这个场景应用比较普遍,

比如多个线程下载多个文件,比如3个线程下载10个文件,比如10个线程执行1000条任务队列;

Demo代码如下:

using System;
using System.Threading;
public partial class Form1 : Form
{
    private ThreadProxy _threadsProxy = null;
    ExpressCollection list = new ExpressCollection();

    public Form1()
    {
        InitializeComponent();

        _threadsProxy = new ThreadProxy(3, list);
        _threadsProxy.ExpressComputed += new EventHandler<ExpressComputedEventArgs>(_threadsProxy_ExpressComputed);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        list.Clear();
        _threadsProxy.Stop();
        list.Add(new Express(1, 1));
        list.Add(new Express(1, 2));
        list.Add(new Express(1, 3));
        list.Add(new Express(1, 4));
        list.Add(new Express(1, 5));
        list.Add(new Express(1, 6));
        list.Add(new Express(1, 7));
        list.Add(new Express(1, 8));
        list.Add(new Express(1, 9));
        list.Add(new Express(1, 10));
        list.Add(new Express(1, 11));
        list.Add(new Express(1, 12));
        list.Add(new Express(1, 13));
        list.Add(new Express(1, 14));
        Console.WriteLine("启动线程...........................");
        _threadsProxy.Run();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (_threadsProxy != null)
        {
            Console.WriteLine("测试暂停...........................");
            _threadsProxy.Stop();
        }
    }

    void _threadsProxy_ExpressComputed(object sender, ExpressComputedEventArgs e)
    {
        Console.WriteLine(string.Format("ThreadID:{0}  {1} + {2} = {3}",
            Thread.CurrentThread.ManagedThreadId, e.Express.A, e.Express.B, e.Result));
    }
}
public class ThreadProxy : IDisposable
{
    private int _threadCount = 1;
    ExpressCollection _list;
    private Thread[] _threads = null;
    private bool _isRun = false;

    public ThreadProxy(ExpressCollection list)
    {
        _list = list;
    }

    public ThreadProxy(int threadCount, ExpressCollection list)
        : this(list)
    {
        _threadCount = threadCount;
        _threads = CreateThreadCollection();
    }

    public void Run()
    {
        if (!_isRun && _list != null && _list.Count > 0)
        {
            _isRun = true;
            for (int i = 0; i < _threadCount; i++)
            {
                _threads[i] = new Thread(new ThreadStart(ThreadInvoke));
                _threads[i].IsBackground = true;
                _threads[i].Start();
            }
        }
    }

    protected virtual Thread[] CreateThreadCollection()
    {
        return new Thread[_threadCount];
    }

    public void Stop()
    {
        _isRun = false;
    }

    private void ThreadInvoke()
    {
        try
        {
            while (_isRun)
            {
                Express express = _list.GetNext();
                if (express != null)
                {
                    int result = express.A + express.B;
                    OnExpressComputed(result, express);
                    //do something
                    Thread.Sleep(1000);//测试暂停
                }
                else
                {
                    break;
                }
            }
        }
        catch (ThreadAbortException)
        {
            Thread.ResetAbort();
            return;
        }
        catch (Exception)
        {
            //记录日志
        }
    }

    public event EventHandler<ExpressComputedEventArgs> ExpressComputed;

    protected virtual void OnExpressComputed(int result, Express express)
    {
        if (ExpressComputed != null)
        {
            ExpressComputed(this, new ExpressComputedEventArgs(result, express));
        }
    }

    #region IDisposable 成员

    public void Dispose()
    {
        _isRun = false;
        if (_threads != null)
        {
            _threads = null;
        }
    }

    #endregion
}

public class ExpressComputedEventArgs : EventArgs
{
    private int result;

    public int Result
    {
        get { return result; }
        set { result = value; }
    }

    public ExpressComputedEventArgs(int result, Express express)
    {
        this.result = result;
        this.express = express;
    }

    private Express express;

    public Express Express
    {
        get { return express; }
        set { express = value; }
    }
}
public class BaseCollection<T> : List<T>
{
    protected readonly object _lockObj = new object();

    private int index = 0;
    public virtual T GetNext()
    {
        T result = default(T);
        if (this.Count > 0 && index < Count)
        {
            lock (_lockObj)
            {
                result = this[index];
                index++;
            }
        }
        return result;
    }

    public new void Add(T item)
    {
        lock (_lockObj)
        {
            base.Add(item);
        }
    }

    public new void Clear()
    {
        lock (_lockObj)
        {
            index = 0;
            base.Clear();
        }
    }
}
public class Express
{
    private int _a;

    public int A
    {
        get { return _a; }
        set { _a = value; }
    }

    private int _b;

    public int B
    {
        get { return _b; }
        set { _b = value; }
    }

    public Express(int a, int b)
    {
        _a = a;
        _b = b;
    }
}
public class ExpressCollection : BaseCollection<Express>
{

}

 

源代码下载
http://www.cnblogs.com/szyicol/archive/2009/07/17/1525485.html

分享到:
评论

相关推荐

    Delphi多线程Demo

    这个压缩包中是一个简单的多线程实例,在线程执行时,每隔一秒刷新一次当前时间!演示了如何在不影响主进程的情况下如何执行其他长时间等待任务。

    单任务多线程多断点下载Demo

    多条线程同时下载一个任务,下载中断时,将以下载的数据大小存入数据库,网络恢复时,自动查询数据库中是否存在未下载完成任务,有就下载,没有就查询任务表执行下一个下载任务; 有必要的话 自己来建一个下载任务表...

    PB9多线程Demo

    注意事项: 1、主进程传入的对象或变量不管...2、“任务线程类”中有一个内部timing类,监控自己是否执行完成,会改标志。“任务管理类”也有一个timing监控“任务信息类”和“任务线程类”的情况,把完成的结束。

    ios demo,dispatch_async,DISPATCH_QUEUE_CONCURRENT,多任务并发执行,自动创建多线程

    ios demo,dispatch_async,DISPATCH_QUEUE_CONCURRENT,多任务并发执行,自动创建多线

    通过多线程任务处理大批量耗时业务并返回结果

    通过多线程处理大批量耗时业务,并返回结果。当监测到线程池中存在空闲线程时则动态向线程池中添加新的任务,直到所有任务执行结束。Demo为自己写的测试使用,下载后可直接运行测试。

    RunDemo.rar

    VS+QT多线程实现,继承Qthread,重写run方法。写了一个demo。子线程里面为一个循环函数,没有执行实际任务。主要是为了方便理解。

    android 网络应用轻量框架-多线程管理-高效缓存-设计模式

    6:使用状态模式 观察者模式更好的处理多线程 最初的想法:网络优化开发框架 (移除任务未完成) 网络稳定,系统运行稳定性,大内存消耗稳定,长时间运行稳定性 (旧的系统症结所在) 开启过多线程,导致系统...

    TaskQueue的DEMO SHOW

    TaskQueue的DEMO SHOW实现队列的多线程任务分配.

    Qt QThreadPool线程池 Demo

    线程池是一种线程使用模式,它管理着一组可重用的线程,可以处理分配过来的可并发执行的任务。 线程池设有最大线程数,可以避免线程数过多会导致额外的线程切换开销。 线程池管理的线程具有可重用性,可以减少创建和...

    系统日志分析demo

    最近完成了一个日志分析项目,执行效率也还行。顺手抽取了思路写了一个demo,分享给大家。 eclipse直接导入Java Project。build path需要自己修改一下。...项目使用了Quartz、Jaxb和spring多线程等技术。

    线程超时死掉

    InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationException V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException,...

    TaskManager.zip

    多线程并发执行任务demo,用到 System.Threading.Tasks

    GCD详解Demo

    GCD详解Demo 同步异步任务,并行串行队列 同步和异步决定了要不要开启新的线程 同步:在当前线程中执行任务,不具备开启新线程的能力 ...并发:多个任务并发(同时)执行 串行:一个任务执行完毕后,再执行下一个任务

    【Python资源】通过 queue 队列及时刷新 tkinter 界面的 demo 案例

    简介: 本 Demo 演示了如何使用 Python 的标准库 queue 和 tkinter 来创建一个简单的图形用户界面(GUI)。...通过多线程实现耗时操作的并行执行。 在耗时操作期间,GUI 界面可以显示进度或状态信息。

    派单管理系统demo.zip

    多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过...

    taskPHP--基于php开发的定时计划任务框架.zip

    | | ... 更多任务 | |-- config.php 全局配置文件 |-- main.php 框架入口文件 |-- windows_single.cmd windows快速启动文件 框架说明 linux下子进程执行任务,修改脚本无需重启后台服务立即...

    个人总结的Java算法和实战demo.zip

    多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过...

    毕业设计,非遗文化中心App交互设计Demo.zip

    多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过...

    java基础练习demo,算法练习,leetecode操练.zip

    多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过...

    springboot-schedule:springboot定时任务demo

    springboot定时任务demo 使用SpringBoot创建定时任务非常简单, 目前主要有以下三种创建方式: 一、基于注解(@Scheduled) 二、基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从...

Global site tag (gtag.js) - Google Analytics