进程。线程与线程池
进程和线程
进程:一个程序就是一个进程,它包含着运行程序所需要的所有的资源。进程之间是独立的,一个进程无法直接访问另一个进程的数据。(除非使用分布式计算方式)
一个进程运行失败也不会影响到其他进程的运行。进程可以理解为一个程序的基本边界。
process类封装了操作进程的方法
线程:windows任务调度的最小单位。线程是程序中的一个代码流,代码必须执行在线程中,有线程才有代码执行
进程是一个资源的拥有着,进程的创建,撤销和切换的过程中,系统都必须为之付出巨大的时空资源。
前台线程与后台线程的区别:
后台线程在程序退出时退出,前台线程会在执行完代码之后退出。
Thread封装了操作线程的方法
创建线程 方法无参数版:
ThreadStart threadStart = new ThreadStart();//括号中写调用进程启动的方法 Threard myThread = new Thread(threadStart); //创建一个thread的实例 [myThread.Name="";] //线程名 [myThread.Prioryity=ThreadPriorytyNormal;]建议系统将创建的线程优先级设为最 高 [myThread.IsBackground=true;] //是否为后台线程, myThread.Start //告诉CPU线程可以启动了 myThread.Join(int) //阻塞主线程,等待子线程执行完毕。括号内等待毫秒。 [myThread.Abort();] // 强行终止线程,此方法会引发异常,暴力手段。
当不允许阻塞ui线程时,创建多线程。
方法有参数时
ParameterizedThreadStart parThreadStart = new ParameterizedThreadStart(方法名); Thread myThread = new Thread(parThreadStart); myThread.Start(方法参数);
既然无法跨线程访问数据,那么如何在程序猿手动创建的线程中访问form控件的值呢?
1.在页面的构造函数中写这么一串代码
控件.CheckForillegalCrossThreadCalls=false; //取消对某控件的跨线程访问监视
上面这种方法很low,微软会无缘无故的封装一个监视控件跨线程吗?
2.使用Invork方法
invoke会沿着标签去找寻找创建控件的线程执行下面的方法,谁创建了textBox的线程,就用该线程调用该委托
this.textBox1.Invoke(委托[,参数]);
文件并发:
当多个资源访问同一个线程,需要加锁。lock(object a) {code b}
线程切换非常消耗资源,Cpu在切换线程时,需要把当前线程执行的状态保持到寄存器里去。
创建也非常消耗资源,线程创建非常慢,占用大量的内存空间,每个线程里面最少1M内存开销。
线程池:提高了线程的利用率,非常适合工作任务非常小,而且又需要使用单独的线程来解决的问题。
- 线程池中取出的线程都是后台线程。
- 我们想手动关闭线程的话,就要手动创建线程。
- 当要对线程池的线程优先级做设置的情景下,手动创建线程。
- 如果执行的线程执行时间特别长,建议手动创建线程。
关于线程池的更多信息。
http://www.cnblogs.com/heyuquan/archive/2012/12/23/threadPool-manager.html