`

多线程执行多任务的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

分享到:
评论

相关推荐

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    多线程demo程序-轻松掌握多线程技术

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在服务器端开发和高并发应用中,多线程能够充分利用CPU资源,提高程序的运行效率。这个名为"多线程demo程序-轻松掌握多线程技术"的项目,旨在帮助开发者理解...

    iOS多线程Demo

    在“iOS多线程Demo”中,可能会包含如何在后台线程完成耗时操作后,在主线程更新UI的方法,如使用`dispatch_async`向主线程发送任务,或者使用`performSelectorOnMainThread`。 此外,多线程还会涉及线程安全问题,...

    Delphi多线程Demo

    在这个“Delphi多线程Demo”中,我们将探讨如何在Delphi中创建和管理线程,以及如何实现在线程中定时刷新任务,以保持用户界面的响应性。 首先,我们需要理解多线程的基本概念。在单线程程序中,所有任务都在同一个...

    多任务多线程demo.zip_C#_C# 多任务下载_下载_多任务_多线程

    在C#编程中,多任务多线程是一个重要的概念,特别是在处理大文件下载或执行大量I/O密集型操作时,可以显著提升程序的效率。这个"多任务多线程demo.zip"是一个示例项目,展示了如何利用C#来实现一个多线程文件下载...

    易语言多线程demo.rar

    在编程领域,多线程是一种常见且重要的技术,特别是在需要并发执行多个任务或优化资源利用率时。易语言,作为一款国人自创的编程语言,同样支持多线程编程,使开发者能够利用多核处理器的优势,提高程序的执行效率。...

    多线程demo/java多线程练习

    在Java编程中,多线程是一项关键技能,它能让程序同时执行多个任务,提升系统效率。本项目"多线程demo/java多线程练习"旨在通过实际操作来深入理解和掌握多线程技术,同时模拟数据库操作,这在现代应用程序开发中至...

    C#多线程Demo

    在C#编程中,多线程是一个至关重要的概念,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应性。本压缩包“C#多线程Demo”提供了四个具体的WinForm多线程示例,旨在帮助开发者深入理解和掌握线程的使用...

    C++多线程demo

    在C++编程中,多线程(Multithreading)是一种技术,它允许程序同时执行多个独立的任务或子任务。这可以极大地提高效率,特别是在多核处理器系统中,每个线程都可以在不同的处理器核心上运行。本示例"MultiThread...

    异步多线程Demo

    多线程允许程序同时执行多个独立的任务,提高系统的并发性和资源利用率。这个“异步多线程Demo”很可能是为了帮助学习者理解并实践多线程编程而提供的一个实例。 1. **线程定义**:线程是程序执行的最小单元,每个...

    android多线程demo(很清晰很详细)

    本文将深入探讨Android多线程的相关知识点,基于“android多线程demo(很清晰很详细)”的描述,我们将围绕这个示例进行讲解。 1. **线程基础**: - **主线程**:Android应用的UI线程,负责处理用户交互和更新界面。...

    untiy 多线程demo

    它可以安全地在后台线程执行任务,避免了与Unity主线程的冲突。Loom V1.6可能包含了更高级的功能,如线程池管理、任务调度、错误处理等,简化了在Unity中实现复杂多线程逻辑的过程。 5. **多线程应用**:在Unity中...

    linux多线程demo

    多线程允许一个应用程序同时执行多个不同的任务,每个任务被称为一个线程。在Linux中,可以使用POSIX线程库(pthread)来创建和管理线程。主要API包括`pthread_create()`用于创建线程,`pthread_join()`等待线程结束...

    Delphi 多线程 DEMO

    多线程允许程序同时执行多个不同的任务,提高资源利用率。 2. **TThread类**:在Delphi中,我们可以利用VCL框架中的TThread类来创建自定义的线程。TThread是线程的基础类,提供了线程的创建、同步、通信等功能。 3...

    android 多线程下载demo

    这个"android多线程下载demo"展示了如何利用多线程分段下载一个APK文件,同时实现实时更新UI展示下载进度,并在下载完成后自动跳转到应用安装界面。以下是对这个Demo涉及知识点的详细解释: 1. **多线程下载**:多...

    基于VS2010的C++多线程开发Demo

    在单线程程序中,所有任务都在同一个执行流中完成,而多线程则允许程序同时执行多个任务,提高了程序的并行性。在VS2010中,我们可以利用C++ Standard Template Library(STL)中的`&lt;thread&gt;`库来创建和管理线程。 ...

    Spring3.0 mvc 定时器及多线程任务demo

    在某些场景下,定时任务可能需要执行多线程任务。比如,定时检查数据库中的待处理任务,并使用多线程并行处理这些任务。此时,可以在定时任务中调用标记了`@Async`的方法,实现定时任务和多线程任务的完美结合。 ...

    c++ 多线程线程池 demo

    5. 销毁线程池:当没有更多任务且所有任务都执行完毕后,线程池会关闭,工作线程会被安全地终止。 在C++中,实现线程池可以利用`std::condition_variable`和`std::queue`等工具来实现线程间的同步和通信。`std::...

Global site tag (gtag.js) - Google Analytics