线程池本身是不是其实并非多线程,只是起个防止cpu占用太高的作用?--关于多线程,不明白一些概念,新手求教

xinrensheng 2012-06-25 02:16:23
1.比如我把work过程放到线程池ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf work), Nothing).我这个work里面是很长的一个循环.那这个work过程执行的时候是不是自动多线程地进行呢?还是说是单线程地进行?
我试了一下,我如果不把work放到线程池,那程序是会假死的.放到线程池以后就不会假死了.但是速度并不会快,甚至感觉好像慢了.所以我觉得它其实是单线程运行的,线程池只不过起个防止cpu占用太高的作用?

2.另外请教个多线程的概念问题:
1)"多线程"其实是"多任务"的意思是吗?就是说使用了多线程以后,我一个程序里或者同一个过程里都可以"同时"执行很多个任务(也就是说不用等a任务结束再来进行b任务)?其实多少有点相当于运行多个程序?

2)正因为上面这一点,如果两个线程执行的任务需要用到同一个变量,那就会出错是吗?多个线程执行的任务所使用的变量是不能重叠的? 比如如果两个线程执行的任务都需要临时性地把数据输出到textbox1,而两个线程又是同时进行的,那textbox1中的数据就会错乱是吗?
我曾经试了个在多个线程里都把数据输出到同一个文本文件,发现会报错说"文件在使用中".
比如下面这样:
Imports System
Imports System.Threading

Public Class AClass

Dim filename As String = "r:\test.txt"
Public Sub Method1()
Dim i As Integer
For i = 1 To 10
Dim file As New System.IO.StreamWriter(filename, True) '如果是r:\test.txt 要怎么写? "r:\test.txt"
file.WriteLine("这是类AClass方法method1的内容" + i) 'Text)
file.Close()
'Console.WriteLine("这是类AClass方法method1的内容", i)
Next
End Sub

Public Sub Method2()
Dim i As Integer
For i = 1 To 10
Dim file As New System.IO.StreamWriter(filename, True) '如果是r:\test.txt 要怎么写? "r:\test.txt"
file.WriteLine("这是类AClass方法method2的内容" + i) 'Text)
file.Close()
'Console.WriteLine("这是类AClass方法method2的内容", i)
Next
End Sub

End Class

Public Class ThreadTest

Public Shared Sub Main() '在Main()方法中,我们创建了类Thread的实例。
Dim obj As New AClass
Dim th1, th2 As Thread

th1 = New Thread(New ThreadStart(AddressOf obj.Method1))
th1.Start()

th2 = New Thread(New ThreadStart(AddressOf obj.Method2))
th2.Start()

Dim filename As String = "r:\test.txt"
Dim i As Integer
For i = 1 To 10
Dim file As New System.IO.StreamWriter(filename, True) '如果是r:\test.txt 要怎么写? "r:\test.txt"
file.WriteLine("这是Main方法里的内容" + i) 'Text)
file.Close()
' Console.WriteLine("Main方法里的内容", i)
Next
End Sub

End Class


看了些书,没感性概念,求指教,多谢!
...全文
502 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xboxeer 2012-06-25
  • 打赏
  • 举报
回复
那就看你怎么理解任务这个概念了 因为我看了这么多书都是用进程 线程 从没哪个用任务来表达你所说的这种概念 线程共享进程内部的资源 所以说会有你的那个数据并发访问的问题 线程池呢我没用过 给不了啥有用的建议 如果是用一般的线程的话你是需要用lock或者monitor来锁住你不希望被并发访问的对象的
[Quote=引用 4 楼 的回复:]
引用 2 楼 的回复:
所谓假死 就是说你的UI线程阻塞住了 这个时候他内部正在处理你的代码 没有办法监听到用户界面的变动 比如单机什么的 所以看上去就是所谓假死
多线程解决的问题就是另外开了一个线程 让他背后去执行任务 而你的UI线程在这个时候还是可以监听到用户界面的变化 比如单击等等

任务这个概念其实是比较人为的一个概念 既可以代表多线程 也可以代表多进程 但是多进程和多线程是有本质……
[/Quote]
xinrensheng 2012-06-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
所谓假死 就是说你的UI线程阻塞住了 这个时候他内部正在处理你的代码 没有办法监听到用户界面的变动 比如单机什么的 所以看上去就是所谓假死
多线程解决的问题就是另外开了一个线程 让他背后去执行任务 而你的UI线程在这个时候还是可以监听到用户界面的变化 比如单击等等

任务这个概念其实是比较人为的一个概念 既可以代表多线程 也可以代表多进程 但是多进程和多线程是有本质上的区别的 同时运行多个程……
[/Quote]
那大致是这样:多线程类似一个进程里面多个任务.?
"同步访问",那这个需要自己在程序里面另外加一些代码呵?但是如果我扔到线程池 是不是就不用管了?像这样:ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf work), Nothing).不用管work过程里面的变量怎么样?.
谢谢!
xinrensheng 2012-06-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
1.请问你如何理解线程池里最大并发线程数这个属性设置滴
2.请msdn什么是线程安全对象,什么是非线程安全对象。什么是lock

ps:“文件在使用中”和多线程没有关系,这和你文件打开方式有关,文件打开方式有独占,有读写共享等多种方式
[/Quote]
1.请问你如何理解线程池里最大并发线程数这个属性设置滴
--这是说我work放到线程池了就自动是多线程在执行了?--否则无所谓"最大并发线程数"概念.2.请msdn什么是线程安全对象,什么是非线程安全对象。什么是lock
--这个应该是说线程之间肯定是可以做到即使重叠使用某个变量也是可以隔离的?
如果我用一个循环来下载listbox1中几百个网页源码(下载下来用正则提取里面的一些内容),我只需要把这个循环过程(过程名比如叫work)放到线程池,这么简单一句:ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf work), Nothing).就可以自动会多线程执行这个过程了是吗?如果某一个网页下载时卡住了,程序会自动先挂起它,而先下载别的网页?
多谢!
xboxeer 2012-06-25
  • 打赏
  • 举报
回复
所谓假死 就是说你的UI线程阻塞住了 这个时候他内部正在处理你的代码 没有办法监听到用户界面的变动 比如单机什么的 所以看上去就是所谓假死
多线程解决的问题就是另外开了一个线程 让他背后去执行任务 而你的UI线程在这个时候还是可以监听到用户界面的变化 比如单击等等

任务这个概念其实是比较人为的一个概念 既可以代表多线程 也可以代表多进程 但是多进程和多线程是有本质上的区别的 同时运行多个程序就是多进程 多线程是在一个进程的范围里面 当然.net的话我觉得应该是用应用程序域来讲更加合适

线程执行用到同一个变量视需求而定 有些操作是需要线程安全的 也就是同步访问 那么被访问的资源一个时候只能被一个线程访问
wanghui0380 2012-06-25
  • 打赏
  • 举报
回复
1.请问你如何理解线程池里最大并发线程数这个属性设置滴
2.请msdn什么是线程安全对象,什么是非线程安全对象。什么是lock

ps:“文件在使用中”和多线程没有关系,这和你文件打开方式有关,文件打开方式有独占,有读写共享等多种方式

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧