进程。线程与线程池

进程和线程
进程:一个程序就是一个进程,它包含着运行程序所需要的所有的资源。进程之间是独立的,一个进程无法直接访问另一个进程的数据。(除非使用分布式计算方式)

一个进程运行失败也不会影响到其他进程的运行。进程可以理解为一个程序的基本边界。

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

感谢着知识大爆炸的时代,感谢这人人共享的精神
原文地址:https://www.cnblogs.com/Zhang-silence/p/6403163.html