注意:如果您将此限制为"3"只是为了不让运行应用程序的机器淹没,我首先要确保这是一个问题.线程池应该为你管理这个.另一方面,如果你不想压倒其他一些资源,请继续阅读!
您无法管理线程池的大小(或者实际上关于它的任何内容).
在这种情况下,我将使用信号量来管理对资源的访问.在您的情况下,您的资源正在运行Web scrape,或计算某些报告等.
为此,在静态类中,创建一个信号量对象:
System.Threading.Semaphore S = new System.Threading.Semaphore(3, 3);
然后,在每个线程中,您执行此操作:
System.Threading.Semaphore S = new System.Threading.Semaphore(3, 3); try { // wait your turn (decrement) S.WaitOne(); // do your thing } finally { // release so others can go (increment) S.Release(); }
每个线程将在S.WaitOne()上阻塞,直到给出信号继续.一旦S减少了3次,所有线程都会阻塞,直到其中一个增加计数器.
这个解决方案并不完美.
如果您想要更清洁,更高效的东西,我建议您使用BlockingQueue方法,其中您将要执行的工作排入全局阻塞队列对象.
同时,你有三个线程(你创建的 - 不在线程池中),弹出队列中的工作来执行.这不是那么棘手的设置,而且非常快速和简单.
例子:
最佳线程队列示例/最佳实践
在并发程序中从BlockingQueue获取对象的最佳方法?