C 執行緒 第二線程方法

2022-04-02 20:23:45 字數 4122 閱讀 1193

主要包括:執行緒阻塞,執行緒終止,執行緒鎖三方面。

thread.sleep(4000); //阻塞4s

輸出結果:

兩次列印輸出間隔為:4秒。執行緒阻塞以毫秒為單位。

sleep也支援timespan,將當前執行緒阻塞指定的時間。

第一次看到msdn的解釋一下子沒有反應過來。這裡我們可以理解為:分別開啟三個執行緒t1,t2,t3對t1,t2,t3依次呼叫join後,程式會先把執行緒t1執行完後,在執行執行緒t2的內容..以此類推到t3。

如下**所示:

1

var watch =stopwatch.startnew();

2 thread t1 = new thread(() =>3);

7t1.start();

8t1.join();

9 console.writeline("

t1.join() returned.");

1011 thread t2 = new thread(() =>

12);

16t2.start();

17t2.join();

18 console.writeline("

t2.join() returned.");

1920 console.writeline("

總結:join()會阻塞呼叫執行緒直到呼叫執行緒結束.

" + watch.elapsedmilliseconds);

輸出結果:

程式先執行執行緒t1裡的內容,讓執行緒阻塞4秒,因為執行緒t1呼叫join()方法阻塞呼叫執行緒,直到t1執行緒執行完成。

然後列印出「t1.join() returned.」。在執行t2執行緒,直到t2執行緒執行完後才執行主線程列印的內容。

這裡不難看出他們是按順序來執行的。

如果我們不使用join()方法看看他的輸出結果會是怎麼樣:

var watch =stopwatch.startnew();

thread t1 = new thread(() =>);

t1.start();

console.writeline("

t1.join() returned.");

thread t2 = new thread(() =>);

t2.start();

console.writeline("

t2.join() returned.");

console.writeline(

"總結:join()會阻塞呼叫執行緒直到呼叫執行緒結束.

" + watch.elapsedmilliseconds);

輸出結果:

此時主線程會先開啟t1執行緒,t1被阻塞4秒 。所以t1執行緒裡的內容沒有被列印出來,會在4秒後列印。

這時主線程不會等待t1執行緒完成後在執行下面**,主線程會繼續向下執行列印出「t1.join() returned.」

然後開啟t2執行緒,t2執行緒同樣也會被阻塞了1秒。

主線程會繼續向下執行列印出其他內容。最後陸續由執行緒t2,執行緒t1列印出各自對應資訊。

1 thread t1 = new thread(() =>29

catch

(threadabortexception ex)

10.狀態:

", thread.currentthread.name, thread.currentthread.threadstate);12}

13 console.writeline("

我在執行著!");

14}1516

});17 t1.name = "t1"

;18t1.start();

19 thread.sleep(1000

);20

t1.abort();

21 console.writeline("

當前執行緒名稱:.狀態:

", t1.name, t1.threadstate);

輸出結果:

開啟t1執行緒,阻塞800毫秒列印了二次「我在執行著!」,準備執行第三次時。

阻塞1000毫秒的主線程呼叫abort()方法直接把t1執行緒給乾掉了.他再也沒有站起來執行第四次列印。

當前t1執行緒直接被乾掉。

1 thread t2 = new thread(() =>210

catch

(threadinterruptedexception ex)

11.狀態:

", thread.currentthread.name, thread.currentthread.threadstate);13}

14}15});

16 t2.name = "t2"

;17t2.start();

18 thread.sleep(1000

);19

t2.interrupt();

20 console.writeline("

當前執行緒名稱:.狀態:

", t2.name, t2.threadstate);

21 console.read();

輸出結果:

開啟t2執行緒,阻塞800毫秒列印了二次「我在執行著!」,準備執行第三次時。

阻塞1000毫秒的主線程呼叫interrupt()方法把t2執行緒第三次阻塞中斷,但t2執行緒並未被終止,繼續在執行。

直到執行緒執行結束。

先來看一下多執行緒在訪問共享變數未加鎖的情況:

1

int number = 0;2

//沒加鎖

3for (int i = 0; i < 10; i++)

4).start();

11 }

輸出結果:

我們發現開啟10個執行緒去訪問乙個共享變數number,在沒有加鎖的情況下有5個執行緒訪問到的值都是:0。

當多個執行緒存在併發的時,難免會碰到相互衝突的事情。這個時候我們就會用到鎖。

lock()方法在msil中會被編譯成 monitor.enter()和monitor.exit()。

在來看看多執行緒在訪問共享變數加鎖的情況:

1

//加鎖

2int number = 0;3

object objlock = new

object

();4

for (int i = 0; i < 10; i++)

5).start();

15 }

輸出結果:

加鎖後我們發現多執行緒在訪問共享變數採用的是排他模式。

每次訪問共享變數都只有乙個執行緒,其他執行緒只能等待別的執行緒訪問完成後才能進行訪問。[monitor.enter()和monitor.exit()必須是成對使用.]

1

object objlock = new

object

();2

new thread(() =>

3).start();

1617

18new thread(() =>

19).start();

輸出結果:

多元函式第二 線性空間(1)定義

線性空間是屬於線性代數研究的物件。之所以也放在多元函式專題中,是為了主題的連續性。否則一會多元函式,一會線性代數,太亂了。更何況,數學的各個分支學科本就是相互滲透,融合。將各個學科刻意地孤立,除了讓人更加困惑,別無他用。我在學習數學時,常常遇到看不下去的情況。之所以看不下去,是因為預備知識掌握得不充...

二 執行緒狀態

新建狀態 new 用new關鍵字建立乙個執行緒物件後,該執行緒物件就處於新生狀態。處於新生狀態的執行緒有自己的記憶體空間,通過呼叫start方法進入就緒狀態。就緒狀態 runnable 處於就緒狀態的執行緒已經具備了執行條件,但是還沒有被分配到cpu,處於 執行緒就緒佇列 等待系統為其分配cpu。就...

執行緒(二) 執行緒控制 後台執行緒

設定執行緒為後台執行緒,前台執行緒結束後,後台執行緒也就結束了 這個有乙個時間差 setdaemon boolean on 檢測線程是否是後台執行緒 isdaemon public class daemonthread extends thread param args public static ...