运行结果:

  但是为什么开始输出Thread1 sleep?有时候也会在中间随机输出呢?
  其实,线程池的启动和终止不是我们程序所能控制的,线程池中的线程执行完之后是没有返回值的,我们可以用ManualResetEvent通知一个或多个正在等待的线程已发生事件
  修改后的代码:
using System;
using System.Threading;
namespace Threading
{
class Program
{
//新建ManualResetEvent对象并且初始化为无信号状态
private static ManualResetEvent mre = new ManualResetEvent(false);
public static void Thread1(object data)
{
Console.WriteLine("Thread1 => {0}",data.ToString());
if (Convert.ToInt32(data) == 9)
{
mre.Set();
}
}
static void Main(string[] args)
{
//控制线程数大小
//第一个参数是:线程池中辅助线程的大数目
//第二个参数是:线程池中异步 I/O 线程的大数目
ThreadPool.SetMaxThreads(3, 3);
for (int i = 0; i < 10; i++)
{
//ThreadPool是静态类无需实例化,
//ThreadPool.QueueUserWorkItem(new WaitCallback(Thread1), i);
ThreadPool.QueueUserWorkItem(Thread1, i);
}
//阻止当前线程,直到当前 WaitHandle 收到信号为止。
mre.WaitOne(Timeout.Infinite, true);
Console.WriteLine("Thread1 sleep");
Thread.Sleep(100000);
Console.WriteLine("Thread1 end");
Console.ReadKey();
}
}
}
  输入结果:

  ok,搞定。
  参考资料:
  ThreadPool:https://msdn.microsoft.com/zh-cn/library/system.threading.threadpool.aspx#Y0
  ManualResetEvent:https://msdn.microsoft.com/zh-cn/library/system.threading.manualresetevent.aspx
  五、总结
  多线程的好处:
  可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样大大提高了程序的效率。
  多线程的不利方面:
  线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
  多线程需要协调和管理,所以需要CPU时间跟踪线程;
  线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
  线程太多会导致控制太复杂,终可能造成很多Bug;