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


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

    主要状态为: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的朋友可以小窗私聊我

  • 相关阅读:
    儿童节扣扣讲座心得
    leetcode -- Best Time to Buy and Sell Stock II
    leetcode -- Best Time to Buy and Sell Stock
    JDeveloper中文乱码问题
    Oracle BAM数据量限制64000解决办法
    记录一条纠结了SQL语句
    OEPE创建webservice出现的一些问题
    Oracle OSB [Security:090304]Authentication Failed
    ICommand简单用法
    Oracle BAM添加企业消息源实现数据的实时监控
  • 原文地址:https://www.cnblogs.com/zhangxiaoyong/p/5099741.html
Copyright © 2020-2023  润新知