以ThreadStart方式實現多線程

3.1 使用ThreadStart委托

這里先以一個例子體現一下多線程帶來的好處,首先在Message類中建立一個方法ShowMessage(),里面顯示了當前運行線程的Id,并使用Thread.Sleep(int ) 方法模擬部分工作。在main()中通過ThreadStart委托綁定Message對象的ShowMessage()方法,然后通過Thread.Start()執行異步方法。

復制代碼
 1       public class Message
2 {
3 public void ShowMessage()
4 {
5 string message = string.Format("Async threadId is :{0}",
6 Thread.CurrentThread.ManagedThreadId);
7 Console.WriteLine(message);
8
9 for (int n = 0; n < 10; n++)
10 {
11 Thread.Sleep(300);
12 Console.WriteLine("The number is:" + n.ToString());
13 }
14 }
15 }
16
17 class Program
18 {
19 static void Main(string[] args)
20 {
21 Console.WriteLine("Main threadId is:"+
22 Thread.CurrentThread.ManagedThreadId);
23 Message message=new Message();
24 Thread thread = new Thread(new ThreadStart(message.ShowMessage));
25 thread.Start();
26 Console.WriteLine("Do something ..........!");
27 Console.WriteLine("Main thread working is complete!");
28
29 }
30 }
復制代碼


請注意運行結果,在調用Thread.Start()方法后,系統以異步方式運行Message.ShowMessage(),而主線程的操作是繼續執行的,在Message.ShowMessage()完成前,主線程已完成所有的操作。

?

3.2 使用ParameterizedThreadStart委托

ParameterizedThreadStart委托與ThreadStart委托非常相似,但ParameterizedThreadStart委托是面向帶參數方法的。注意ParameterizedThreadStart 對應方法的參數為object,此參數可以為一個值對象,也可以為一個自定義對象。

復制代碼
 1     public class Person
2 {
3 public string Name
4 {
5 get;
6 set;
7 }
8 public int Age
9 {
10 get;
11 set;
12 }
13 }
14
15 public class Message
16 {
17 public void ShowMessage(object person)
18 {
19 if (person != null)
20 {
21 Person _person = (Person)person;
22 string message = string.Format("\n{0}'s age is {1}!\nAsync threadId is:{2}",
23 _person.Name,_person.Age,Thread.CurrentThread.ManagedThreadId);
24 Console.WriteLine(message);
25 }
26 for (int n = 0; n < 10; n++)
27 {
28 Thread.Sleep(300);
29 Console.WriteLine("The number is:" + n.ToString());
30 }
31 }
32 }
33
34 class Program
35 {
36 static void Main(string[] args)
37 {
38 Console.WriteLine("Main threadId is:"+Thread.CurrentThread.ManagedThreadId);
39
40 Message message=new Message();
41 //綁定帶參數的異步方法
42 Thread thread = new Thread(new ParameterizedThreadStart(message.ShowMessage));
43 Person person = new Person();
44 person.Name = "Jack";
45 person.Age = 21;
46 thread.Start(person); //啟動異步線程
47
48 Console.WriteLine("Do something ..........!");
49 Console.WriteLine("Main thread working is complete!");
50
51 }
52 }
復制代碼


運行結果:

?

3.3 前臺線程與后臺線程

注意以上兩個例子都沒有使用Console.ReadKey(),但系統依然會等待異步線程完成后才會結束。這是因為使用Thread.Start()啟動的線程默認為前臺線程,而系統必須等待所有前臺線程運行結束后,應用程序域才會自動卸載。

在第二節曾經介紹過線程Thread有一個屬性IsBackground,通過把此屬性設置為true,就可以把線程設置為后臺線程!這時應用程序域將在主線程完成時就被卸載,而不會等待異步線程的運行。

?

3.4 掛起線程

為了等待其他后臺線程完成后再結束主線程,就可以使用Thread.Sleep()方法。

復制代碼
 1     public class Message
2 {
3 public void ShowMessage()
4 {
5 string message = string.Format("\nAsync threadId is:{0}",
6 Thread.CurrentThread.ManagedThreadId);
7 Console.WriteLine(message);
8 for (int n = 0; n < 10; n++)
9 {
10 Thread.Sleep(300);
11 Console.WriteLine("The number is:" + n.ToString());
12 }
13 }
14 }
15
16 class Program
17 {
18 static void Main(string[] args)
19 {
20 Console.WriteLine("Main threadId is:"+
21 Thread.CurrentThread.ManagedThreadId);
22
23 Message message=new Message();
24 Thread thread = new Thread(new ThreadStart(message.ShowMessage));
25 thread.IsBackground = true;
26 thread.Start();
27
28 Console.WriteLine("Do something ..........!");
29 Console.WriteLine("Main thread working is complete!");
30 Console.WriteLine("Main thread sleep!");
31 Thread.Sleep(5000);
32 }
33 }
復制代碼

運行結果如下,此時應用程序域將在主線程運行5秒后自動結束

?

但系統無法預知異步線程需要運行的時間,所以用通過Thread.Sleep(int)阻塞主線程并不是一個好的解決方法。有見及此,.NET專門為等待異步線程完成開發了另一個方法thread.Join()。把上面例子中的最后一行Thread.Sleep(5000)修改為 thread.Join() 就能保證主線程在異步線程thread運行結束后才會終止。

?

3.5 Suspend 與 Resume (慎用)

Thread.Suspend()與 Thread.Resume()是在Framework1.0 就已經存在的老方法了,它們分別可以掛起、恢復線程。但在Framework2.0中就已經明確排斥這兩個方法。這是因為一旦某個線程占用了已有的資源,再使用Suspend()使線程長期處于掛起狀態,當在其他線程調用這些資源的時候就會引起死鎖!所以在沒有必要的情況下應該避免使用這兩個方法。

?

3.6 終止線程

若想終止正在運行的線程,可以使用Abort()方法。在使用Abort()的時候,將引發一個特殊異常 ThreadAbortException 。
若想在線程終止前恢復線程的執行,可以在捕獲異常后 ,在catch(ThreadAbortException ex){...} 中調用Thread.ResetAbort()取消終止。
而使用Thread.Join()可以保證應用程序域等待異步線程結束后才終止運行。

復制代碼
 1          static void Main(string[] args)
2 {
3 Console.WriteLine("Main threadId is:" +
4 Thread.CurrentThread.ManagedThreadId);
5
6 Thread thread = new Thread(new ThreadStart(AsyncThread));
7 thread.IsBackground = true;
8 thread.Start();
9 thread.Join();
10
11 }
12
13 //以異步方式調用
14 static void AsyncThread()
15 {
16 try
17 {
18 string message = string.Format("\nAsync threadId is:{0}",
19 Thread.CurrentThread.ManagedThreadId);
20 Console.WriteLine(message);
21
22 for (int n = 0; n < 10; n++)
23 {
24 //當n等于4時,終止線程
25 if (n >= 4)
26 {
27 Thread.CurrentThread.Abort(n);
28 }
29 Thread.Sleep(300);
30 Console.WriteLine("The number is:" + n.ToString());
31 }
32 }
33 catch (ThreadAbortException ex)
34 {
35 //輸出終止線程時n的值
36 if (ex.ExceptionState != null)
37 Console.WriteLine(string.Format("Thread abort when the number is: {0}!",
38 ex.ExceptionState.ToString()));
39
40 //取消終止,繼續執行線程
41 Thread.ResetAbort();
42 Console.WriteLine("Thread ResetAbort!");
43 }
44
45 //線程結束
46 Console.WriteLine("Thread Close!");
47 }
復制代碼

運行結果如下

?

轉載于:https://www.cnblogs.com/meilibao/archive/2012/10/16/2725736.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260304.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260304.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260304.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

管理思考

管理基礎 分活 分錢 分責任 分權 安人(安排 配置) 流程 標準 考核 治人(協調 指揮 控制) 社會越來越復雜 分工越來越復雜 合作越來越重要 目標一定要一致共同的意愿共識 需要大家參與管理 業務劃分 責任劃分 流程梳理 如何合作做好安全工作 安全服務因為不承擔責任 責任主體是管…

我的atom插件

atom插件實在是太多了&#xff0c;下面就說說我的插件 1.minimap 右邊的小地圖&#xff0c;和sublime里面的差不多&#xff1b; 2.open-in-browser 右擊默認瀏覽器打開&#xff1b; 3.emmet 這個不用多說吧&#xff0c;html快速編譯 4.git-plus 直接在atom提交代碼&#xff0…

python統計英文句子每個單詞字數_Python小書3-文本英文單詞統計

之前寫Python Web小書第三小節本來用的垃圾郵件的案例三郎&#xff1a;Python貝葉斯推理垃圾郵件分類?zhuanlan.zhihu.com后來發現里面的東西&#xff0c;涉及到概率&#xff0c;程序太復雜了。。。哈哈哈所以就想著&#xff0c;哪天重寫一下&#xff0c;選來選去&#xff0c;…

java9特性_96.java基礎10(java9/10/11新特性)

126.java 9 新特性1(模塊化功能):1.java模塊化2.java 交互式環境jshell3.泛型package com.atguigu.java;import org.junit.Test;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.util.Ar…

MonoRail - 簡介 [基礎知識篇]

MonoRail - 簡介 起源 MonoRail是一個.NET的MVC web開發框架, 原名Castle On Rails, 是CastleProject的一個子項目. 作者hammett在使用過Ruby On Rails后, 覺得非常棒, 他希望在享受ror的開發模式的同時能使用大量現有的資源, 于是就用.NET寫出了一個Castle On Rails. 后來ror那…

結對編程(黃金點游戲)

我扮演的角色是駕駛員 一、結對伙伴 領航員&#xff1a;趙峻 作業地址見我的博客。 二、代碼地址 https://coding.net/u/k2048/p/huangjindian/git/blob/master/main.c 三、總結 1、個人總結 本次作業我扮演駕駛員&#xff0c;趙峻扮演領航員&#xff0c;我負責算法實現以及代碼…

qtgl 鼠標平移 c++_羅技真愛粉的MX Master 3無線鼠標體驗

?這是一篇關于羅技MX Master3的曬單&#xff0c;順帶也翻出我的庫存清潔整理一下吧。在決定購買一款新鼠標的時候&#xff0c;我的第一目標其實是MX Vertical垂直鼠標&#xff0c;不過MX Vertical目前優勢只在外形上&#xff0c;在MX系列中明顯屬于低配&#xff0c;自由滾輪、…

java實驗指導書(實驗四)答案_java程序設計實驗指導書答案

? 狗生活在陸地上(是一種陸生動物)&#xff0c;既是哺乳類的也是肉食性的。狗通常的時候和人打招呼會通過“搖搖尾巴”&#xff0c;在被撫摸感到舒服的時候&#xff0c;會“旺旺叫”&#xff0c;而在受到驚嚇情緒煩躁時&#xff0c;會發出“嗚嗚”聲&#xff1b;? 貓也生活在…

php代碼規范說明文檔

命名規則&#xff1a;采用駝峰標識&#xff0c;盡量做到見名知義 PHP編碼規范與原則&#xff1a; //命名&#xff1a;類&#xff0c;方法&#xff0c;函數&#xff0c;變量&#xff0c; 注釋&#xff1a;開發中難免留下一些臨時代碼和調試代碼&#xff0c;此類代碼必須添加注釋…

下載網頁中的圖片到本地

簡單的一個下載如下 &#xff1a; string url "http://avatar.csdn.net/A/2/6/2_yefengzhixia.jpg";string filepath "D:\\pic.jpg";WebClient mywebclient new WebClient();mywebclient.DownloadFile(url, filepath);MessageBox.Show("OK");…

nacos linux啟動_微服務系列之Nacos配置中心之一:Nacos介紹與安裝

一、Nacos 介紹Nacos 是 Alibaba 公司推出的開源工具&#xff0c;用于實現分布式系統的服務發現與配置管理。英文全稱 Dynamic Naming and Configuration Service&#xff0c;Na 為 Naming/NameServer 即注冊中心&#xff0c;co 為 Configuration 即配置中心&#xff0c;Servic…

演練:在組件設計器中創建 Windows 服務應用程序

http://msdn.microsoft.com/zh-cn/library/zt39148a(vvs.80).aspx 演練&#xff1a;在組件設計器中創建 Windows 服務應用程序 .NET Framework 2.0其他版本5&#xff08;共 5&#xff09;對本文的評價是有幫助 - 評價此主題注意 Visual Studio 標準版中不提供“Windows 服務”模…

絕對震撼 7款HTML5動畫應用及源碼

除非特別聲明&#xff0c;PHP100新聞均為原創或投稿報道&#xff0c;轉載請注明作者及原文鏈接 原文地址&#xff1a; http://www.php100.com/html/it/mobile/2014/0702/7030.html [導讀] 關于HTML5動畫&#xff0c;我們已經分享太多了&#xff0c;當然也有很多利用純CSS3實現的…

maven打包指定main函數

2019獨角獸企業重金招聘Python工程師標準>>> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> …

java 任意數平均值_【編程題】通過鍵盤輸入三個任意的數字,計算三個值的平均值,并輸出結果。...

【單選題】對放大電路測試NPN型硅管測得Ube>0,Ubc>0,Uce>0【簡答題】Even ordinary men understand now that the universe is something vaster and broader than ever thought before.【單選題】【其它】The Einsteins,however,could not afford to pay for the adv…

【轉】Direct3D頂點結構使用總結

【轉】Direct3D頂點結構使用總結 D3D里面最基本的就是頂點了&#xff0c;雖說一直在用&#xff0c;可是卻也是自己比較模糊的一個點&#xff0c;知道其中的意思&#xff0c;卻不是很清楚&#xff0c;今天就總結一下&#xff0c;掃一下這個盲區&#xff1a; D3D中的頂點緩沖區的…

quick cocos2d-x 精靈大小(寬高)獲取

quick下sprite的大小獲取&#xff0c;記錄一下&#xff1a; local w sprite:getContentSize().width local h sprite:getContentSize().height 今天連這個最基本的&#xff0c;都不知道怎么獲取。挺實用的代碼額~轉載于:https://www.cnblogs.com/vokie/p/3822248.html

velocityjs 動畫庫 比jquery默認的animate強

神坑記錄&#xff1a; 1、transform: translate3d(80%,0,0); 無法作為參數&#xff0c;必須修改為這種&#xff1a;translateX: 0% 官方文檔 http://velocityjs.org/ github地址 https://github.com/julianshapiro/velocity npm下載安裝 npm install velocity-animate --save-d…

python中的可變數據類型有列表和元組_Python中列表的 += 和 .extend() 的異同

一道Python題最近有朋友“考”了我一個Python的題&#xff1a;使用和.extend()兩種方法擴展元組中的列表會發生什么。雖然我對Python中的可變數據類型、不可變數據類型的概念都有較深的理解&#xff0c;并且也對list的、、.extend()、.append()做過性能分析&#xff0c;但是和.…

簡易貪吃蛇小游戲java版_用GUI實現java版貪吃蛇小游戲

本文實例為大家分享了java版貪吃蛇小游戲的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下項目結構新建一個JFrame窗口,作為程序入口public class GameStart{public static void main(String[] args) {JFrame jFrame new JFrame();jFrame.setBounds(100,100,900,720…