主要包括:執行緒阻塞,執行緒終止,執行緒鎖三方面。
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 ...