線程是一個獨(dú)立的運(yùn)行單元,每個進(jìn)程內(nèi)部都有多個線程,每個線程都可以各自同時(shí)執(zhí)行指令。每個線程都有自己獨(dú)立的棧,但是與進(jìn)程內(nèi)的其他線程共享內(nèi)存。但是對于.NET的客戶端程序(Console,WPF,WinForms)是由CLR創(chuàng)建的單線程(主線程,且只創(chuàng)建一個線程)來啟動。在該線程上可以創(chuàng)建其他線程。
圖:
線程工作方式
多線程由內(nèi)部線程調(diào)度程序管理,線程調(diào)度器通常是CLR委派給操作系統(tǒng)的函數(shù)。線程調(diào)度程序確保所有活動線程都被分配到合適的執(zhí)行時(shí)間,線程在等待或阻止時(shí) (例如,在一個獨(dú)占鎖或用戶輸入) 不會消耗 CPU 時(shí)間。
在單處理器計(jì)算機(jī)上,線程調(diào)度程序是執(zhí)行時(shí)間切片 — 迅速切換每個活動線程。在 Windows 中, 一個時(shí)間片是通常數(shù)十毫秒為單位的區(qū)域 — — 相比來說 線程間相互切換比CPU更消耗資源。在多處理器計(jì)算機(jī)上,多線程用一種混合的時(shí)間切片和真正的并發(fā)性來實(shí)現(xiàn),不同的線程會在不同的cpu運(yùn)行代碼。
創(chuàng)建線程
如:
using System;using System.Threading;class ThreadTest{ static void Main() { Thread t = new Thread (Write2); // 創(chuàng)建線程t t.Start(); // 執(zhí)行 Write2() // 同時(shí)執(zhí)行主線程上的該方法 for (int i = 0; i < 1000; i++) Console.Write ("1"); } static void Write2() { for (int i = 0; i < 1000; i++) Console.Write ("2"); } }//輸出://111122221122221212122221212......
在主線程上創(chuàng)建了一個新的線程,該新線程執(zhí)行WrWrite2方法,在調(diào)用t.Start()時(shí),主線程并行,輸出“1”。
圖:
線程Start()之后,線程的IsAlive屬性就為true,直到該線程結(jié)束(當(dāng)線程傳入的方法結(jié)束時(shí),該線程就結(jié)束)。
CLR使每個線程都有自己獨(dú)立的內(nèi)存棧,所以每個線程的本地變量都相互獨(dú)立。
如:
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26