系統中的執行緒與程序
程序包含window控制代碼,檔案系統和其他核心物件等,每個程序系統都會分配乙個虛擬記憶體,每個程序最少有乙個執行緒。
執行緒是執行程式必須的獨立的指令流,執行緒也有自己的堆疊(記憶體)
應用程式的記憶體和堆由乙個程序中的所有執行緒共享,所引線程之間的交換非常快,但是由於他們共享所在的同一程序的
的資源,所以操作起來會很困難,後面關於多執行緒會介紹。
通俗的將就是 應用程式是由程序執行的,會為程序分配資源(記憶體空間等),程序中又有一些執行緒,會為每個執行緒分配資源
執行緒可以操作程序中的所有資源,應用程式有時要同時進行幾個操作,而執行緒又是彼此獨立的指令流,所以同一時間有多個執行緒在執行,(此處所說的多個執行緒同時執行都不考慮執行緒的執行原理只是通俗的說法)而同一資源有可能有多個執行緒使用。這樣就會帶來執行緒同步的問題,我們可以這些未處理的資源為執行緒不安全的資源。在後面會介紹多執行緒操作。
下面將詳細介紹執行緒的操作
1.前台執行緒和後台執行緒
執行緒可以分為前提執行緒和後台執行緒。只要有乙個前台執行緒在執行,應用程式就會執行,主線程main()方法執行結束,
還有幾個前台執行緒在執行,程式就會在執行,當所以的前台的執行緒都結束了後程式才會停止。(不考慮後台執行緒)
thread類建立的執行緒預設都是前台執行緒,執行緒池的執行緒總是後台執行緒。
thread類建立的執行緒有 isbackground屬性如果為true是為可以設定執行緒為後台執行緒
例項:class program
static void threadmain()
",thread.currentthread.name);
thread.sheep(3000);
console.writeline("漂亮的好孩子",thread.currentthread.name);}}
此時會控制台上會列印
「我們都是好孩子boy」
「main方法結束」
「漂亮的好孩子boy」
如果加上t1.isbackground=true;
控制台會列印
「我們都是好孩子boy」
」main方法結束「
執行緒的操作
用thread類建立執行緒
class program
stateobject so = new stateobject();
threadmethod tm = new threadmethod();
//thread t1 = new thread(tm.methodhasparam);
"我們都是好孩子!");
thread t1 = new thread(delegate() );
t1.start();
console.readkey();}}
public class threadmethod
public void methodhasparam(object o)
",o);}}
2. 執行緒池 threadpool
執行緒池原理:執行緒池中有乙個個有執行緒組成的工作者列隊,而要執行的操作也會形成乙個工作項列隊,工作項列隊滿足先進先出的原則(先進入工作項列隊的先進入執行緒列隊中處理)。工作者執行緒列隊會處理進入的乙個個要執行的操作,進入執行緒列隊滿足後進先出得原則(後進入的先處理),如果工作列隊已滿,還有需要執行的操作,要執行的操作(工作者)就回進入下乙個執行緒列隊,保證每乙個開啟的執行緒列隊的所有執行緒都在工作,極大的提高了執行緒的利用率。
執行緒池也有預設容許的最大工作執行緒和i/o執行緒容量。一般雙核處理器預設容許最大工作執行緒為50,i/o執行緒為1000個。不過此值可以設定,一般不會手動設定。當所有的工作執行緒都在工作時,工作者列隊會等待直到有空閒執行緒為止。
執行緒池例項:
class program
",nworkerthreads);
console.writeline("i/o執行緒:",ncompletionportthreads);
for (int i = 0; i < 6; i++)
console.readkey();
}static void jopthread(object state)
,當前執行緒的id:", i, thread.currentthread.managedthreadid);
thread.sleep(50);}}
}注意:執行緒池中的執行緒都是後台執行緒,而且不能將其設定為前台執行緒,不能為執行緒池中線程設定優先順序和名稱。執行緒池中線程都由乙個唯一標示的id
(managedthreadid)
執行緒的同步:
由於執行緒獨立的指令流,並舉執行緒共享同一程序中的資源。當多個執行緒操作同一資料,也就是執行緒的同步。產生執行緒同步如下:
為了避免執行緒的同步 可以使用lock關鍵字
lock關鍵字
public class dome}}
也可以:
class program
);t[i].start();
}for (int i = 0; i < threadnum; i++)
console.writeline("結果是:",sn.num);
console.readkey();}}
public class statenum
}public class dalenum}}
}執行緒的死鎖:
使用lock關鍵字時可能出現死鎖:
例如:方法deadlock1()和deadlock2()現在改變兩個物件s1和s2的物件。這就進行了兩個鎖定。方法deadlock1()先鎖定s1在鎖定s2,方法deadlock2()
先鎖定s2再鎖定s1。有可能出現這種情況,deadlock1()方法等待deadlock2();解除s2鎖定,而deadlock2等待deadlock1解除s1的鎖定,此時就
會出現死鎖
解除死鎖的方法:
lock語句c#編譯器會解析為monitor類
lock(obj)
等同於:
monitor.enter(obj);
tryfinally
下面就介紹避免死鎖的方法
monitor類可以獲得鎖定的超時值,這樣就不會無限期的等待獲得鎖定。
可以使用tryenter方法,給它傳送乙個超時值,等到獲得鎖定最大超時值
如果得到obj會返回true,如果鎖定超過指定時間,則返回false,執行其他操作
if(monitor.tryenter(obj,500))
finally
}這樣就解決了死鎖問題
還有關於執行緒類thread的一些方法join,就不坐介紹了
關於windowsform的跨執行緒呼叫和一些操作執行緒的類,這裡就不介紹了,
執行緒基礎與執行緒同步
二 執行緒同步 我們都知道,程序是運轉中的程式,是為了在cpu上實現多道程式設計而發明的乙個概念。但是程序在乙個時間只能幹一件事情,如果想要同時幹兩件或者多件事情,例如同時看兩場電影,我們自然會想到傳說中的分身術,就像孫悟空那樣可以變出多個真身。雖然我們在現實中無法分身,但程序卻可以辦到,辦法就是執...
執行緒安全與執行緒同步
執行緒安全 可重入函式 執行緒之間共享全域性資料段 靜態資料,引起非執行緒安全。執行緒安全可以通過執行緒同步對臨界資源訪問進行控制來實現。有些系統呼叫或者庫函式的實現時發生不安全現象,在多執行緒環境下就需要使用這些函式的安全版本,即可重入函式。例如 字串分割函式 普通版本 char strtok c...
執行緒安全與同步執行緒
資料有負數,相同的情況 比如在進行搶票的時候。可能會出現在第資料不準確的現象 public class unsafe implements runnable public static void test catch interruptedexception e system.out.println...