多线程(2)Thread
2018-06-18 04:12:56来源:未知 阅读 ()
我们先从最基础的Thread说起。
创建并启动线程
创建并启动一个线程,如下代码:
1 namespace ConsoleApplication17 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 var thread = new Thread(PrintNumbers); 8 thread.Start(); 9 10 Console.WriteLine("Thread Start..."); 11 Console.ReadKey(); 12 } 13 14 /// <summary> 15 /// 匹配委托的方法 16 /// </summary> 17 public static void PrintNumbers() 18 { 19 Console.WriteLine("Starting......"); 20 for (int i = 0; i < 10; i++) 21 { 22 Console.WriteLine(i); 23 } 24 } 25 } 26 }
运行结果:
暂停线程
假如需要暂停当前线程,可以调用Thread.Sleep方法,使当前线程处于阻塞状态,如下代码:
1 namespace ConsoleApplication17 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 var thread = new Thread(PrintNumbersWithDelay); 8 thread.Start(); 9 10 Console.WriteLine("Thread Start..."); 11 Console.ReadKey(); 12 } 13 14 /// <summary> 15 /// 16 /// </summary> 17 public static void PrintNumbersWithDelay() 18 { 19 Console.WriteLine("Starting......"); 20 for (int i = 0; i < 10; i++) 21 { 22 Thread.Sleep(TimeSpan.FromMilliseconds(1000)); 23 Console.WriteLine(string.Format("{0} {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), i)); 24 } 25 } 26 } 27 }
输出结果:
合并线程
如果需要等待某个子线程执行行,主线程才继续执行时,可以使用Thread.Join方法来实现,如下代码:
1 namespace ConsoleApplication17 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //Thread 8 var thread = new Thread(PrintNumbersWithDelay); 9 thread.Start(); 10 thread.Join(); 11 12 Console.WriteLine("Thread Completed!"); 13 Console.ReadKey(); 14 } 15 16 /// <summary> 17 /// 18 /// </summary> 19 public static void PrintNumbersWithDelay() 20 { 21 Console.WriteLine("Starting......"); 22 for (int i = 0; i < 10; i++) 23 { 24 Thread.Sleep(TimeSpan.FromMilliseconds(1000));//线程阻塞1s,此时线程状态为WaitSleepJoin 25 Console.WriteLine(string.Format("当前时间:{0},线程状态:{1},结果:{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),Thread.CurrentThread.ThreadState, i)); 26 } 27 } 28 } 29 }
输出结果:
终止线程
如果在子线程运行过程中强制终止它,可以调用Thread.Abort方法,这会给当前子线程触发ThreadAbortException异常,导致线程被终止!
如下代码:
1 namespace ConsoleApplication17 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Console.WriteLine("Starting Program..."); 8 var thread = new Thread(PrintNumbersWithDelay); 9 thread.Start(); 10 11 Thread.Sleep(TimeSpan.FromMilliseconds(6000)); 12 thread.Abort(); 13 14 Console.WriteLine("Thread has been abort!"); 15 Console.ReadKey(); 16 } 17 18 /// <summary> 19 /// 20 /// </summary> 21 public static void PrintNumbersWithDelay() 22 { 23 Console.WriteLine("Starting......"); 24 for (int i = 0; i < 10; i++) 25 { 26 Thread.Sleep(TimeSpan.FromMilliseconds(1000)); 27 Console.WriteLine(string.Format("当前时间:{0},线程状态:{1},结果:{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Thread.CurrentThread.ThreadState, i)); 28 } 29 } 30 } 31 }
线程传递参数
通过分析可以发现,Thread接受的实际上是一个委托,包括无参数的委托和接受一个Object类型的委托,
如下代码:
1 namespace ConsoleApplication17 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Console.WriteLine("Main thread starting..."); 8 var thread = new Thread(PrintNumbersWithCount); 9 thread.Start(5); 10 thread.Join(); 11 12 Console.WriteLine("Main thread completed!"); 13 Console.ReadKey(); 14 } 15 16 /// <summary> 17 /// 匹配委托方法,带参数 18 /// </summary> 19 public static void PrintNumbersWithCount(object obj) 20 { 21 Console.WriteLine("Sub thread starting..."); 22 var number = Convert.ToInt32(obj); 23 for (int i = 0; i < number; i++) 24 { 25 Console.WriteLine(string.Format("当前时间:{0},线程状态:{1},结果:{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Thread.CurrentThread.ThreadState, i)); 26 } 27 } 28 } 29 }
输出结果:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:多线程(3)ThreadPool
下一篇:支付网关思考
- 最详细的java多线程教程来了 2020-06-08
- 深入解析ThreadLocal和ThreadLocalMap 2020-06-08
- 系统化学习多线程(一) 2020-06-08
- 多线程:生产者消费者(管程法、信号灯法) 2020-06-01
- 如何合理地估算线程池大小? 2020-05-31
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash