线程池本身是不是其实并非多线程,只是起个防止cpu占用太高的作用?--关于多线程,不明白一些概念,新手求教
1.比如我把work过程放到线程池ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf work), Nothing).我这个work里面是很长的一个循环.那这个work过程执行的时候是不是自动多线程地进行呢?还是说是单线程地进行?
我试了一下,我如果不把work放到线程池,那程序是会假死的.放到线程池以后就不会假死了.但是速度并不会快,甚至感觉好像慢了.所以我觉得它其实是单线程运行的,线程池只不过起个防止cpu占用太高的作用?
2.另外请教个多线程的概念问题:
1)"多线程"其实是"多任务"的意思是吗?就是说使用了多线程以后,我一个程序里或者同一个过程里都可以"同时"执行很多个任务(也就是说不用等a任务结束再来进行b任务)?其实多少有点相当于运行多个程序?
2)正因为上面这一点,如果两个线程执行的任务需要用到同一个变量,那就会出错是吗?多个线程执行的任务所使用的变量是不能重叠的? 比如如果两个线程执行的任务都需要临时性地把数据输出到textbox1,而两个线程又是同时进行的,那textbox1中的数据就会错乱是吗?
我曾经试了个在多个线程里都把数据输出到同一个文本文件,发现会报错说"文件在使用中".
比如下面这样:
- VB.NET code
Imports SystemImports System.ThreadingPublic 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 SubEnd ClassPublic 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 SubEnd Class看了些书,没感性概念,求指教,多谢!
[解决办法]
1.请问你如何理解线程池里最大并发线程数这个属性设置滴
2.请msdn什么是线程安全对象,什么是非线程安全对象。什么是lock
ps:“文件在使用中”和多线程没有关系,这和你文件打开方式有关,文件打开方式有独占,有读写共享等多种方式
[解决办法]
所谓假死 就是说你的UI线程阻塞住了 这个时候他内部正在处理你的代码 没有办法监听到用户界面的变动 比如单机什么的 所以看上去就是所谓假死
多线程解决的问题就是另外开了一个线程 让他背后去执行任务 而你的UI线程在这个时候还是可以监听到用户界面的变化 比如单击等等
任务这个概念其实是比较人为的一个概念 既可以代表多线程 也可以代表多进程 但是多进程和多线程是有本质上的区别的 同时运行多个程序就是多进程 多线程是在一个进程的范围里面 当然.net的话我觉得应该是用应用程序域来讲更加合适
线程执行用到同一个变量视需求而定 有些操作是需要线程安全的 也就是同步访问 那么被访问的资源一个时候只能被一个线程访问