传递参数
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都不同
2.使用线程池
可以看到Thread Id很多是重复的,所以用线程池是可以提升性能的.甚至你可以打开任务管理器可以看到使用了线程池的程序,同样的结果比使用创建100个线程内存使用上也少很多.
线程池的容量
ThreadPool提供了一些方法获取线程的数量及设置最小和最大线程数量,但最好还是保持系统默认值吧,不要去动。使用最多的将还是QueueUserWorkItem方法