小议线程之单线程、多线程、线程池
线程的一些主要状态以及状态之间的装换 (如下图)
主要状态为:1.新建 2.就绪 3.运行 4阻塞 5.死亡
其中:join()可以用来邀请其他线程先执行
yield()告诉系统"把自己的CPU时间让掉,让其他线程或者自己运行"
引入线程的好处:
线程池
当线程的执行时间远大于创建时间和销毁时间之和时,采用线程池不仅调整和缩短创建线程,销毁线程的时间,而且它还显著减少了创建线程的数目。
一般一个简单线程池至少包含下列组成部分。
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/