码迷,mamicode.com
首页 > 编程语言 > 详细

线程系列06,通过CLR代码查看线程池及其线程

时间:2014-09-22 18:11:12      阅读:377      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   使用   ar   strong   for   


在"线程系列04,传递数据给线程,线程命名,线程异常处理,线程池"中,我们已经知道,每个进程都有一个线程池。可以通过TPL,ThreadPool.QueueUserWorkItem,委托与线程池交互。本篇体验:通过查看CLR代码来观察线程池及其线程。

□ 通过编码查看线程池和线程

 

使用ThreadPool的静态方法QueueUserWorkItem把线程放入线程池,来看线程池线程和主程序线程的执行情况。

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主线程开始");
            for (int i = 0; i < 5; i++)
            {
                ThreadPool.QueueUserWorkItem(SayHello, i);
            }
            Console.WriteLine("主线程结束");
        }
        static void SayHello(object arg)
        {
            int n = (int) arg;
            Console.WriteLine("线程{0}接收到的参数是:{1},是否是后台线程:{2}",
                Thread.CurrentThread.ManagedThreadId,
                n,
                Thread.CurrentThread.IsBackground);
        }       
    }

bubuko.com,布布扣

○ 用QueueUserWorkItem方法加入线程池的线程是后台线程
○ 一旦主线程结束,后台线程随即结束
○ 在主程序for语句块中,有2个线程已被创建并执行

 

让主线程和线程池线程都Sleep一段时间。

   class Program
    {
        static Random r = new Random();
        static void Main(string[] args)
        {
            Console.WriteLine("主线程开始");
            for (int i = 0; i < 5; i++)
            {
                ThreadPool.QueueUserWorkItem(SayHello, i);
            }
            Thread.Sleep(r.Next(250, 500));
            Console.WriteLine("主线程结束");
        }
        static void SayHello(object arg)
        {
            Thread.Sleep(r.Next(250, 500));
            int n = (int) arg;
            Console.WriteLine("线程{0}接收到的参数是:{1},是否是后台线程:{2}",
                Thread.CurrentThread.ManagedThreadId,
                n,
                Thread.CurrentThread.IsBackground);
        }       
    }

bubuko.com,布布扣

○ 线程池中的线程依然是后台线程
○ 让主线程Sleep一段时间后,线程池的线程在主线程结束之前得以执行

 

再让主线程Sleep更长的一段时间。

        static void Main(string[] args)
        {
            Console.WriteLine("主线程开始");
            for (int i = 0; i < 5; i++)
            {
                ThreadPool.QueueUserWorkItem(SayHello, i);
            }
            Thread.Sleep(r.Next(1000, 3000));
            Console.WriteLine("主线程结束");
        }

bubuko.com,布布扣 

当主线程Sleep的时间更长后,线程池有更多的线程被执行。

 

□ 使用"即时窗口"查看CLR中的线程池和线程

 

以上,通过编码查看线程池和线程,实在是太不方便。我们可以在"即时窗口"中,借助"SOS调试扩展"来观察CLR中的线程池和线程。

→在"Thread.Sleep(r.Next(1000, 3000))"打上断点
→点击"启动"
→当代码运行到断点处,点击"调试"--"窗口"--"即时",打开"即时窗口"
→输入如下命令,加载"SOS调试扩展"
bubuko.com,布布扣
关于"SOS调试扩展"的使用,可参考"调试查看CLR运行代码"。

→输入如下命令,查看线程池
bubuko.com,布布扣

○ Worker Thread显示当前线程池中的线程状况
○ Work Request in Queue显示当前队列中的线程
→输入如下命令,查看所有线程
bubuko.com,布布扣

○ MTA (Finalizer)表示由GC回收的线程
○ MTA (Threadpool Worker) 表示线程池中的线程

 

□ 查看CLR托管堆上的所有线程类型

 

→输入如下命令查看CLR托管堆上的所有线程类型
bubuko.com,布布扣

 

□ 查看CLR托管堆上线程池实例

 

→找到System.ThreadPoolWorkQueue,复制其前面的MT代码
→输入如下命令,查看线程池实例的堆地址、数量等
bubuko.com,布布扣

 

□ 查看CLR托管线程池地址

 

→复制System.Threading.ThreadPoolWorkQueue的托管堆地址
→输入如下命令查看CLR托管线程池地址内容
bubuko.com,布布扣

 

线程系列包括:

线程系列01,前台线程,后台线程,线程同步

线程系列02,多个线程同时处理一个耗时较长的任务以节省时间

线程系列03,多线程共享数据,多线程不共享数据

线程系列04,传递数据给线程,线程命名,线程异常处理,线程池

线程系列05,手动结束线程

线程系列06,通过CLR代码查看线程池及其线程

 

线程系列06,通过CLR代码查看线程池及其线程

标签:style   blog   http   color   os   使用   ar   strong   for   

原文地址:http://www.cnblogs.com/darrenji/p/3986231.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!