线程的工作方式是操作系统为它们提供处理器时间。当这种情况发生时,这称为上下文切换。上下文切换大约需要 2000-8000 个周期(即取决于处理器 2000-8000 条指令)。如果操作系统有许多 CPU 或内核,它可能不需要将 CPU 从一个线程中取出并交给另一个线程——避免上下文切换。每个 CPU 一次只能运行一个线程,当您需要 CPU 的线程多于 CPU 时,您将强制进行上下文切换。上下文切换的执行速度不超过系统时间片(客户端每 20 毫秒,服务器每 120 毫秒)。
如果您有 5000 个后台工作人员,那么您实际上有 5000 个线程。这些线程中的每一个都可能在争夺 CPU 时间。在客户端版本的 Windows 上,这意味着每秒 250,000 次上下文切换。即每秒 500,000,000 到 2,000,000,000 个周期仅用于线程之间的切换。(即超过你的线程正在执行的工作)如果它甚至可以每秒处理那么多上下文切换。
推荐的做法是每个处理器只有一个 CPU 绑定线程。CPU-bound 线程是一个花费很少时间“等待”的线程。UI 线程不是 CPU 绑定线程。如果您的后台工作线程花费大量时间等待锁定,那么它们也可能不受 CPU 限制——但一般来说,后台工作线程受 CPU 限制。(否则,使用后台工作人员有什么意义?)。
此外,操作系统会花费大量时间来确定接下来需要哪个线程来获取 CPU。当您开始更改线程优先级时,您会干扰它,并且大多数时候最终会使您的整个系统(不仅仅是您的应用程序)变慢而不是更快。
更新:
与之相关的是,创建一个新线程大约需要 200,000 个周期,而销毁一个线程大约需要 100,000 个周期。
更新 2:
如果问题的推动力不仅仅是“如果可以做到”,而是能够扩展工作负载,那么正如@JoshW/@Servy 提到的那样,使用生产者/消费者模式之类的东西将允许可扩展性,从而促进横向通过队列或服务总线扩展到多台计算机/节点。简单地启动大量线程是不可扩展的,超出了 CPU 的数量。如果您真正想要的是一种可以横向扩展的架构,因为“可用资源......机器的过载程度”根本不可能。