進程。線程與線程池

進程和線程
進程:一個程序就是一個進程,它包含着運行程序所須要的全部的資源。進程之間是獨立的,一個進程沒法直接訪問另外一個進程的數據。(除非使用分佈式計算方式)html

一個進程運行失敗也不會影響到其餘進程的運行。進程能夠理解爲一個程序的基本邊界。windows

process類封裝了操做進程的方法多線程

線程:windows任務調度的最小單位。線程是程序中的一個代碼流,代碼必須執行在線程中,有線程纔有代碼執行併發

進程是一個資源的擁有着,進程的建立,撤銷和切換的過程當中,系統都必須爲之付出巨大的時空資源。分佈式

 

前臺線程與後臺線程的區別:函數

後臺線程在程序退出時退出,前臺線程會在執行完代碼以後退出。ui

 


Thread封裝了操做線程的方法
this

建立線程 方法無參數版:spa

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

相關文章
相關標籤/搜索