小议线程之单线程、多线程、线程池

线程的一些主要状态以及状态之间的装换 (如下图)

主要状态为:1.新建 2.就绪 3.运行 4阻塞  5.死亡

        其中:join()可以用来邀请其他线程先执行

                 yield()告诉系统"把自己的CPU时间让掉,让其他线程或者自己运行"

 

引入线程的好处:

1 创建一个线程花费的时间少。
2 两个线程(在同一进程中的)的切换时间少。
3 由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。
4 线程能独立执行,能充分利用和发挥处理机与外围设备并行工作的能力。
 

线程池

        当线程的执行时间远大于创建时间和销毁时间之和时,采用线程池不仅调整和缩短创建线程,销毁线程的时间,而且它还显著减少了创建线程的数目。

一般一个简单线程池至少包含下列组成部分。

       1. 线程池管理器(ThreadPoolManager):用于创建并管理线程池

       2.工作线程(WorkThread): 线程池中线程

       3. 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。

       4.任务队列:用于存放没有处理的任务。提供一种缓冲机制。

下面的简单demo可以很好的解释上面线程以及线程池的实际用法

Demo运行图:

 

 

本示例分别演示了单线程、多线程以及线程池简单的应用。可以让初学者对线程的印象更加深刻。

注:该示例使用VB.NET语言编写,重在讨论实现方法。对语言有要求者请绕道。谢谢

首先申明一个线程组、一个委托和两个变量

 Private ThreadAdd() As Thread '申明线程ThreadAdd()
    Private Delegate Sub ATList(ByVal Content As String) '申明一个委托
    Private ListCount As Integer, CountLimit As Integer '申明一个List里面总数,一个总填充数

单线程操作:

 Dim MakeRand As New Random
        Dim i As Integer
        DataInit()
        Randomize() '初始化随机数生成器
        Do
            i = MakeRand.Next(1, 1000)
            ListCount = ListCount + 1
            AddToListBox(Str(i))
            Application.DoEvents() '处理当前在消息列队中的所有Windows消息
        Loop Until ListCount >= CountLimit
        '做循环,直到List里面数大于等于需要填充的总数
        MakeRand = Nothing

通过获取到随机数i,将得到的随机数传到AddToListBox方法并直接绑定至ListBox上。

 ListBox1.Items.Add(Content) '将得到的随机数添加到Listbox1上
        If ListCount Mod 100 = 0 Or ListCount = CountLimit Then
            ProgressBar1.Value = ListCount '将当前List得到数赋值给进度条
            Application.DoEvents()
        End If

多线程操作:

 ReDim ThreadAdd(Val(TextBox1.Text) - 1) '申明最大允许的线程数
        DataInit() '调用清空进度条和赋值填充数方法
        For i = 0 To ThreadAdd.Length - 1
            ThreadAdd(i) = New Thread(AddressOf ThreadAddToListBox) '分别将每一个线程用AddressOf创建任务,执行ThreadAddToListBox
            With ThreadAdd(i)
                '将当前线程传入进来,分别开始线程
                .IsBackground = True
                .Priority = ThreadPriority.Highest '设置线程的优先级,当前优先级最高
                .Start()
            End With
        Next
        ThreadAdd = Nothing

此文的TextBox1就是运行图中的线程数文本框,ReDim是动态对线程组赋值。通过ThreadAddToListBox 过程方法创建委托赋值

Private Sub ThreadAddToListBox()
        Dim ThreadAdd As New ATList(AddressOf AddToListBox) '实例化一个委托,并用AddressOf语句为这个委托赋值,通过调用AddToListBox过程方法
        Dim MakeRand As New Random '申明一个随机数
        Dim i As Integer
        Randomize() '初始化随机树生成器
        Do
            i = MakeRand.Next(1, 1000)
            Me.Invoke(ThreadAdd, Str(i)) '执行委托
            ListCount = ListCount + 1
        Loop Until ListCount >= CountLimit
        '当列表数超出总填充数则停止循环
        ThreadAdd = Nothing
        MakeRand = Nothing
    End Sub
 ListBox1.Items.Add(Content) '将得到的随机数添加到Listbox1上
        If ListCount Mod 100 = 0 Or ListCount = CountLimit Then
            ProgressBar1.Value = ListCount '将当前List得到数赋值给进度条
            Application.DoEvents()
        End If

线程池操作:

  DataInit()
        For i = 0 To Val(TextBox1.Text - 1)
            ThreadPool.UnsafeQueueUserWorkItem(AddressOf ThreadAddToListBox, Me)
        Next

线程池操作主要是通过调用UnsafeQueueUserWorkItem来为当前线程用委托赋值。

至此,线程操作的简单demo已经全部结束,需要源码demo的朋友可以小窗私聊我

 

posted @ 2016-01-04 17:39  潇十一郎  阅读(838)  评论(0编辑  收藏  举报