判断线程运行状态的两种方法

开发 后端
判断线程运行状态的方法有很多,如可以采用类似于对象计数器的方法等等,那么这里向你介绍两种判断线程运行状态的方法,希望对你有所帮助。

判断线程运行状态的方法有很多,如可以采用类似于对象计数器的方法,所谓对象计数器,就是一个对象被引用一次,这个计数器就加1,销毁引用就减1,如果引用数为0,则垃圾搜集器就会对这些引用数为0的对象进行回收。

判断线程运行状态方法一:线程计数器

线程也可以采用计数器的方法,即为所有需要监视的线程设一个线程计数器,每开始一个线程,在线程的执行方法中为这个计数器加1,如果某个线程结束(在线程执行方法的最后为这个计数器减1),为这个计数器减1。然后再开始一个线程,按着一定的时间间隔来监视这个计数器,如是棕个计数器为0,说明所有的线程都结束了。当然,也可以不用这个监视线程,而在每一个工作线程的最后(在为计数器减1的代码的后面)来监视这个计数器,也就是说,每一个工作线程在退出之前,还要负责检测这个计数器。使用这种方法不要忘了同步这个计数器变量啊,否则会产生意想不到的后果。

判断线程运行状态方法二:使用Thread.join方法

join方法只有在线程结束时才继续执行下面的语句。可以对每一个线程调用它的join方法,但要注意,这个调用要在另一个线程里,而不要在主线程,否则程序会被阻塞的。

个人感觉这种方法比较好。

线程计数器方法演示:

  1. class ThreadCounter : MyThread  
  2. {  
  3. private static int count = 0;  
  4. private int ms;  
  5. private static void increment()  
  6. {  
  7. lock (typeof(ThreadCounter))  // 必须同步计数器  
  8. {  
  9. count++;  
  10. }  
  11. }  
  12. private static void decrease()  
  13. {  
  14. lock (typeof(ThreadCounter))  
  15. {  
  16. count--;  
  17. }  
  18. }  
  19. private static int getCount()  
  20. {  
  21. lock (typeof(ThreadCounter))  
  22. {  
  23. return count;  
  24. }  
  25. }  
  26. public ThreadCounter(int ms)  
  27. {  
  28. this.ms = ms;  
  29. }  
  30. override public void run()  
  31. {  
  32. increment();  
  33. Thread.Sleep(ms);  
  34. Console.WriteLine(ms.ToString()+"毫秒任务结束");  
  35. decrease();  
  36. if (getCount() == 0)  
  37. Console.WriteLine("所有任务结束");  
  38. }  
  39. }  
  40.  
  41.  
  42. ThreadCounter counter1 = new ThreadCounter(3000);  
  43. ThreadCounter counter2 = new ThreadCounter(5000);  
  44. ThreadCounter counter3 = new ThreadCounter(7000);  
  45.  
  46. counter1.start();  
  47. counter2.start();  
  48. counter3.start();  

上面的代码虽然在大多数的时候可以正常工作,但却存在一个隐患,就是如果某个线程,假设是counter1,在运行后,由于某些原因,其他的线程并未运行,在这种情况下,在counter1运行完后,仍然可以显示出“所有任务结束”的提示信息,但是counter2和counter3还并未运行。为了消除这个隐患,可以将increment方法从run中移除,将其放到ThreadCounter的构造方法中,在这时,increment方法中的lock也可以去掉了。代码如:

  1. public ThreadCounter(int ms)  
  2. {  
  3. this.ms = ms;  
  4. increment();  

运行上面的程序后,将显示如下图的结果。

程序运行效果 

使用Thread.join方法演示

  1. private static void threadMethod(Object obj)  
  2. {  
  3. Thread.Sleep(Int32.Parse(obj.ToString()));  
  4. Console.WriteLine(obj + "毫秒任务结束");  
  5. }  
  6. private static void joinAllThread(object obj)  
  7. {  
  8. Thread[] threads = obj as Thread[];  
  9. foreach (Thread t in threads)  
  10. t.Join();  
  11. Console.WriteLine("所有的线程结束");  
  12. }  
  13.  
  14. static void Main(string[] args)  
  15. {  
  16. Thread thread1 = new Thread(threadMethod);  
  17. Thread thread2 = new Thread(threadMethod);  
  18. Thread thread3 = new Thread(threadMethod);  
  19.  
  20.  thread1.Start(3000);  
  21.  thread2.Start(5000);  
  22.  thread3.Start(7000);  
  23.  
  24.  Thread joinThread = new Thread(joinAllThread);  
  25.  joinThread.Start(new Thread[] { thread1, thread2, thread3 });  
  26.  
  27. }  

在运行上面的代码后,将会得到和图2同样的运行结果。上述两种方法都没有线程数的限制,当然,仍然会受到操作系统和硬件资源的限制。

判断线程运行状态的两大方法就向你介绍到这里,希望对你了解和学习线程运行状态的判断有所帮助。

【编辑推荐】

  1. C# byte数组常用扩展浅析
  2. 浅析C#byte数组转化成图像的实现
  3. C#线程概述及视图解析
  4. C#线程操作常见的六大操作方法
  5. C#线程类的定义实例解析
责任编辑:仲衡 来源: 博客园
相关推荐

2009-06-29 18:22:54

Java多线程从线程返回数据

2010-08-04 17:41:52

挂载NFS

2010-01-15 13:30:37

VB.NET并发性

2010-06-02 17:16:16

自动运行SVN

2009-09-25 14:04:09

Hibernate eHibernate h

2011-03-30 17:04:24

MySQL添加用户

2010-04-13 09:50:44

Oracle跟踪

2010-11-24 14:36:25

修复mysql表

2010-02-06 14:35:36

ibmdwRUP迭代

2020-09-16 18:27:36

Linux方法IP地址

2010-09-09 19:53:50

2009-06-18 11:09:42

2009-08-05 13:34:18

C#日期相减

2010-09-07 11:18:10

2019-09-15 17:35:28

Wireshark解密HTTPS

2010-11-12 11:44:37

SQL Server删

2010-09-13 13:05:03

sql server分

2010-11-09 13:09:58

SQL Server分

2010-11-10 13:22:41

SQL Server备

2009-11-06 09:48:40

WCF服务
点赞
收藏

51CTO技术栈公众号