多執行緒基本操作

2022-03-08 12:54:02 字數 1537 閱讀 2968

在多執行緒中經常用到的關鍵字是lock。

lock 關鍵字可確保當乙個執行緒位於**的臨界區時,另乙個執行緒不會進入該臨界區(所謂的臨界點指的是:當多個執行緒訪問乙個更改物件狀態的方法是,因為不知道到底要修改那個狀態,將產生不可預知的資料損壞)。

所以關於多執行緒的程式設計中找到程式的臨界區是很重要的事情。這樣才能表現出多執行緒的意義。

通常,應避免鎖定 public 型別,否則例項將超出**的控制範圍。因為在c#中 public 是為能再當前類以外來訪問它,如果鎖定了 public 型別資料將導致在外部呼叫時,由於沒有別的執行緒鎖定以後沒有釋放,導致程式的等待。這往往是我們不想看到的。 msdn 給的建議是: 定義private 物件來鎖定,或 private static 物件變數來保護所有例項共有的資料。

理解多執行緒可以打乙個比喻。乙個碼頭向另乙個碼頭輸送貨物,如果貨物比較少的話,一條船就可以搞定了。可是如果貨物非常的多,要10條或者更多的船才能運送完。一條船的話是非常浪費時間的,可能要10天才能運送完。要是找10條船的話1天就運完了。代價是你要租9條船。對於作業系統而言,你要租的那9條船就是系統開銷了。如果你的系統有剩餘的資源,這個買賣是非常值的。

在多執行緒例項化的時候都是運用 threadstart 的**,在該**的宣告中需要提供乙個無參的,沒有返回值的方法。乙個執行緒是基於乙個類執行的。當多執行緒公用乙個類裡面的公用資料時(由 static 修飾的資料),也會出現和公用**類似的問題,這種情況就不應該使用lock關鍵字了(因為 lock 會把整個物件給鎖定,這樣的話只能等到該執行緒釋放鎖,別的方法才能執行,不管這個方法是否是為多執行緒提供的方法。) 解決這種情況,c#為我們提供了system.threading 中的乙個類 monitor , monitor 提供了使執行緒共享資源的方案。在system.threading命名空間提供了同步執行緒的類。這些類包括mutex、monitor、interlocked、autoresetevent 和 manualresetevent。

msdn 中的這個模組,詳細的介紹了c#中線程的問題。

執行緒是乙個開銷很大的操作,(msdn原話)為單個資源分配多個執行緒可能會導致同步問題,執行緒會被頻繁阻止以等待其他執行緒,從而與使用多執行緒的初衷背道而馳。多執行緒特別適用於需要不同資源(例如檔案控制代碼和網路連線)的任務。如非必要,請不要刻意的使用執行緒。

threadpool 類解決的執行緒問題主要是:某個執行緒一直在等待乙個狀態的改變,然後給予響應。但是 threadpool 中如果建立了乙個執行緒的話,就會導致這個執行緒一直存在,沒有辦法取消。

控制乙個執行緒池是通過 manualresetevent 物件來實現的,manualresetevent的物件在初始化時可以設定狀態,然後一直保持這個狀態直到呼叫它的reset() 、set() 方法,將狀態設定為 無訊號、有訊號。當執行緒池中所有的執行緒都工作完成以後 manualresetevent 將被設定成有訊號。

能力有限,以後慢慢完善……

多執行緒基本操作

1 繼承thread類建立執行緒 2 實現runnable介面建立執行緒 3 使用callable和future建立執行緒 1.實現callable介面,重寫call 方法,建立該實現類的例項 2.使用futuretask類來包裝callable物件,該futuretask物件封裝了callable...

JavaSE 多執行緒基本操作一

在多執行緒操作中,有一些常用的方法可以直接供我們使用,這篇部落格主要總結一下這些基本操作。1 執行緒的命名與取得 因為多執行緒的執行狀態我們無法確定,所以在對多執行緒的操作必須有乙個明確標識出線程物件的資訊,這個資訊往往通過名稱來描述。在thread類中,提供了一系列的相關方法。方法名稱 型別描述 ...

linux多執行緒程式設計基本操作(2)

linux c多執行緒總結 1 關於執行緒和程序 a 使用多執行緒的理由之一是和程序相比,它是一種非常 節儉 的多工操作方式。我們知道,在linux系統下,啟動乙個新的程序必須分配給 它獨立的位址空間,建立眾多的資料表來維護它的 段 堆疊段和資料段,這是一種 昂貴 的多工工作方式。而執行於乙個程序中...