Thread类:
1.线程创建出来目的是为了执行方法,因此需要给线程类的构造函数传递方法参数,这个参数就是一个委托。
2.调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间有CPU决定。
3. 线程分为前台线程和后台线程:
只用所有的前台线程都关闭,程序才关闭;
只要所有的前台线程都结束,后台线程自动结束。
默认创建出来的线程都是前台线程,只有设置了线程的 IsBackground 属性为true,才为后台线程。
下面看Thread类其内部是怎么实现的:(部分代码)
public class Thread
{
private ThreadStart threadStart; //定义一个TheadStart委托对象(原型: public delegate void ThreadStart();)
private ParameterizedThreadStart paraThreadStart; //定义ParameterizedThreadStart委托对象 ( 原型:public delegate void ParameterizedThreadStart(object obj);)
public Thread(ThreadStart threadStart)
{
this.threadStart=threadStart;
}
//构造函数重载 (带参数委托)
public Thread(ParameterizedThreadStart start)
{
this.paraThreadStart=start;
}
//线程要执行,需提供一个start方法
//调用Start方法,实际上是执行了委托
public void Start()
{
this.threadStart();
}
//Start()的方法重载,带参数的委托方法参数从此Start方法中传入
public void Start(object parameter) //参数必须是object
{
this.paraThreadStart(parameter);
}
}
--程序中是使用不带参数委托:
1. 先写线程执行的方法
public void SayHi()
{}
2. 创建线程
ThreadStart threadStart = new ThreadStart(SayHi); //委托对象赋值
Thread thread = new Thread(threadStart);
3.开启线程
thread.Start();
--程序中使用带参数委托 (参数可以是多个,用数组或集合实现)
1. 先写线程执行的方法
public void SayHi(object name)
{
Message.Show("name:"+name.ToString());
}
2. 创建线程
ParameterizedThreadStart paraThreadStart = new ParameterizedThreadStart(SayHi); //委托对象赋值
Thread thread = new Thread(paraThreadStart);
3.开启线程
thread.Start("Mike");
---------------------------------------------------------------------------------------------------------------
线程池
在程序中,如果创建某种对象所需要的代价太高,同时这个对象又可以反复使用,那么我们往往就会准备一个容器,用来保存一批这样的对象。
以后要用这种对象时,就不需要每次去创建一个,而直接从容器中取出一个现成的对象就可以了,提高程序性能!
显然线程就属于这种对象,故一般在程序中不直接通过new创建线程,而通过线程池获取。
用法:
用线程池中的线程 (只有当线程池中有空闲线程时才执行,否则在队列中等待)
ThreadPool.QueueUserWorkItem(new WaitCallback(WatchConn), sockWatch);
private void WatchConn(object obj) //参数类型为object
{
//线程要执行的代码
}