代码改变世界

多线程编程(3)

2010-11-16 15:46  Clingingboy  阅读(579)  评论(0编辑  收藏  举报

 

传递参数

public class Demo2
{
    private Thread thread2;
    private Thread thread1;
    public Demo2()
    {
        thread1 = new Thread(new ParameterizedThreadStart(Task1));
        thread1.Start("张三");
        thread2 = new Thread(new ParameterizedThreadStart(Task1));
        thread2.Start("李四");
    }

    public void Task1(object name)
    {
        Console.WriteLine(string.Format("{0} do this work",name));
    }
}

线程管理(线程池)

如果有100个任务,则创建100个线程,如

for (int i = 0; i < 100; i++)
{
    var thread = new Thread(Task1);
    thread.Start("people"+i);
}

任务有轻重之分,一个任务完成后可以继续做其他事情,而不必要创建多余的线程.

线程池内部提供了管理线程的机制,在大部分情况下使我们不必去担心线程管理的问题,其会根据需要自动分配线程,如下示例

public Demo2()
{
    for (int i = 0; i < 100; i++)
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(Task1), "people" + i);
    }
    Console.Read();
}

注意点:线程将在后台执行,如果主线程结束退出的话,那么后台线程将无法继续执行,如去掉下面代码

Console.Read()

线程池的线程等价于将Thread的IsBackground属性设置为True,如

hread1 = new Thread(new ParameterizedThreadStart(Task1));
thread1.IsBackground = true;
thread1.Start("张三");

验证差别

1.非线程池

public Demo2()
{
    for (int i = 0; i < 100; i++)
    {
        thread1 = new Thread(new ParameterizedThreadStart(Task1));
        thread1.IsBackground = true;
        thread1.Start("people" + i);
        
    }
    Console.Read();
}

public void Task1(object name)
{
    Console.WriteLine(string.Format("Is Pool:{0},Thread Id {1},{2} do this work",
        Thread.CurrentThread.IsThreadPoolThread,
        Thread.CurrentThread.ManagedThreadId, name));
}

结果,都在非线程池托管,每个ThreadId都不同

image

2.使用线程池

image

可以看到Thread Id很多是重复的,所以用线程池是可以提升性能的.甚至你可以打开任务管理器可以看到使用了线程池的程序,同样的结果比使用创建100个线程内存使用上也少很多.

线程池的容量

ThreadPool提供了一些方法获取线程的数量及设置最小和最大线程数量,但最好还是保持系统默认值吧,不要去动。使用最多的将还是QueueUserWorkItem方法