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

简介: 线程的一些主要状态以及状态之间的装换 (如下图) 主要状态为:1.新建 2.就绪 3.运行 4阻塞  5.死亡         其中:join()可以用来邀请其他线程先执行                  yield()告诉系统"把自己的CPU时间让掉,让其他线程或者自己运行"   引入线程的好处: 1 创建一个线程花费的时间少。

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

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

 

  • 感谢你的阅读。如果你觉得这篇文章对你有帮助或者有启发,就请推荐一下吧~你的精神支持是博主强大的写作动力。欢迎转载!
  • 博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高(其实是个菜B),不足和错误之处在所难免,希望大家能够批评指出。
  • 欢迎加入.NET 从入门到精通技术讨论群→523490820 期待你的加入
  • 不舍得打乱,就永远学不会复原。被人嘲笑的梦想,才更有实现的价值。
  • 我的博客:http://www.cnblogs.com/zhangxiaoyong/
目录
相关文章
|
14天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
25天前
|
存储 缓存 NoSQL
Redis单线程已经很快了6.0引入多线程
Redis单线程已经很快了6.0引入多线程
31 3
|
28天前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
57 0
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
1月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
1月前
|
Java C#
C#学习系列相关之多线程(五)----线程池ThreadPool用法
C#学习系列相关之多线程(五)----线程池ThreadPool用法
|
1月前
|
数据采集 存储 Java
「多线程大杀器」Python并发编程利器:ThreadPoolExecutor,让你一次性轻松开启多个线程,秒杀大量任务!
「多线程大杀器」Python并发编程利器:ThreadPoolExecutor,让你一次性轻松开启多个线程,秒杀大量任务!
|
27天前
|
存储 算法 Java
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
72 0
|
21天前
|
安全 Java 容器
Java并发编程:实现高效、线程安全的多线程应用
综上所述,Java并发编程需要注意线程安全、可见性、性能等方面的问题。合理使用线程池、同步机制、并发容器等工具,可以实现高效且线程安全的多线程应用。
14 1
|
22天前
|
JavaScript 前端开发
JS 单线程还是多线程,如何显示异步操作
JS 单线程还是多线程,如何显示异步操作
22 2

热门文章

最新文章