.NET ThreadPool学习点滴积累(一)

System.Threading.ThreadPool类实现了线程池。ThreadPool类是一个静态类,它提供了管理线程池的一系列方法

ThreadPool中的一些属性方法的意义

ThreadPool.GetMaxThreads(out int ,out int)ThreadPool.SetMaxThreads(int, int);
---------------可以获取和设置线程池的最大线程数,即线程池中共有多少个线程。线程池中的线程数目仅受可用内存的限制。但是,线程池将对允许在进程中同时处于活动状态的线程数目强制实施限制(这取决于CPU的数目和其他因素)。默认情况下,每个系统处理器最多可以运行25个线程池线程。
              ThreadPool.GetMinThreads(out int, out int)ThreadPool.SetMinThreads(int, int);

----------------可以获取和设置线程池所维持的空闲线程数,意思:当线程池处于空闲状态时,线程池中保留多少个线程,以便在有需求时,队列任务可以立即启动。
              ThreadPool.GetAvailableThreads(out int, out int);
  ---------------通过此方法,可以获取当前时刻下,可以使用的线程数目。

QueueUserWorkItem(WaitCallback, Object) 方法和QueueUserWorkItem(WaitCallback)

----------------这些方法将“工作项”(和Object是要传入WaitCallback中的参数)插入到线程池的队列中,并立即返回。工作项只是一种方法(就是WaitCallback类型的委托),它被调用并传递给单个参数(也可以没有参数)。没有参数的QueueUserWorkItem版本将null传递给回调方法。线程池中的某些线程将调用System.Threading.WaitCallback委托表示的回调方法来处理该工作项。回调方法必须与System.Threading.WaitCallback委托类型相匹配。WaitCallback定义如下:

public delegate void WaitCallback(Object state);

调用QueueUserWorkItem时传入的Object类型参数将传递到任务过程,可以通过这种方式来向任务过程传递参数。如果任务过程需要多个参数,可以定义包含这些数据的类,并将类的实例强制转换为Object数据类型。

下面是我学习线程池的代码,用于简单测试这些方法的意义。

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace Demo_ThreadPool
ExpandedBlockStart.gifContractedBlock.gif
{
    
public class Demo_ThreadPool
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
int MaxNum,portThreadNum;
            
int MinNum;
            
int num = 5;
            ManualResetEvent[] doneEvents 
= new ManualResetEvent[num];
            Fibonacci[] fibonaccis 
= new Fibonacci[num];
            Random r 
= new Random();

ContractedSubBlock.gifExpandedSubBlockStart.gif            
ThreadPool中的参数没有设置时的状况#region ThreadPool中的参数没有设置时的状况
            ThreadPool.GetMaxThreads(
out MaxNum, out portThreadNum);
            Console.WriteLine(MaxNum 
+ "-------------------" + portThreadNum);

            ThreadPool.GetMinThreads(
out MinNum, out portThreadNum);
            Console.WriteLine(MinNum 
+ "------------------------" + portThreadNum);

            ThreadPool.GetAvailableThreads(
out MaxNum, out portThreadNum);
            Console.WriteLine(MaxNum 
+ "-------------------" + portThreadNum);

            
for (int i = 0; i < num; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                doneEvents[i] 
= new ManualResetEvent(false);
                fibonaccis[i] 
= new Fibonacci(r.Next(1040), doneEvents[i]);
                ThreadPool.QueueUserWorkItem(fibonaccis[i].ThreadPoolCallback, i);
                ThreadPool.GetAvailableThreads(
out MaxNum, out portThreadNum);
                Console.WriteLine(MaxNum 
+ "-------------------" + portThreadNum);
            }


            
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif            
设置ThreadPool中的线程数的状况#region 设置ThreadPool中的线程数的状况
            ThreadPool.SetMaxThreads(
2040);
            ThreadPool.SetMinThreads(
11);
            
            ThreadPool.GetMaxThreads(
out MaxNum, out portThreadNum);
            Console.WriteLine(MaxNum 
+ "-------------------" + portThreadNum);

            ThreadPool.GetMinThreads(
out MinNum, out portThreadNum);
            Console.WriteLine(MinNum 
+ "------------------------" + portThreadNum);

            ThreadPool.GetAvailableThreads(
out MaxNum, out portThreadNum);
            Console.WriteLine(MaxNum 
+ "-------------------" + portThreadNum);

            
for (int i = 0; i < num; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                doneEvents[i] 
= new ManualResetEvent(false);
                fibonaccis[i] 
= new Fibonacci(r.Next(1040), doneEvents[i]);
                ThreadPool.QueueUserWorkItem(fibonaccis[i].ThreadPoolCallback, i);
                ThreadPool.GetAvailableThreads(
out MaxNum, out portThreadNum);
                Console.WriteLine(MaxNum 
+ "-------------------" + portThreadNum);
            }


            
#endregion


            Console.Read();         
        }

        
static void testReset()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
int i = 0;
            
while (true)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
            Console.WriteLine(
"in the front of "+i++);

            }

        }

    }

    
public class Fibonacci
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public Fibonacci(int n, ManualResetEvent doneEvent)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            _n 
= n;
            _doneEvent 
= doneEvent;
        }


        
// Wrapper method for use with thread pool.
        public void ThreadPoolCallback(Object threadContext)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
int threadIndex = (int)threadContext;
            Console.WriteLine(
"thread {0} started", threadIndex);
            _fibOfN 
= Calculate(_n);
            Console.WriteLine(
"thread {0} result calculated", threadIndex);

            _doneEvent.Set();
        }


        
// Recursive method that calculates the Nth Fibonacci number.
        public int Calculate(int n)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if (n <= 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return n;
            }


            
return Calculate(n - 1+ Calculate(n - 2);
        }


ExpandedSubBlockStart.gifContractedSubBlock.gif        
public int N get return _n; } }
        
private int _n;

ExpandedSubBlockStart.gifContractedSubBlock.gif        
public int FibOfN get return _fibOfN; } }
        
private int _fibOfN;

        
private ManualResetEvent _doneEvent;
    }


}

 

转载于:https://www.cnblogs.com/sqzxcv/archive/2009/10/26/1589680.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值