![](https://csdnimg.cn/release/download_crawler_static/31725416/bg4.jpg)
第 1 章 进程、线程与网络协议
4
过程中需要等待另一个线程 t2 结束后才能继续执行,可以在 t1 的程序模块中调用 t2 的 join()
方法。例如:
t2.Join();
这样 t1 在执行到 t2.Join() 语句后就会处于阻塞状态,直到 t2 结束后才会继续执行。
但是假如 t2 一直不结束,那么等待就没有意义了。为了解决这个问题,可以在调用 t2 的
Join 方法的时候指定一个等待时间,这样 t1 这个线程就不会一直等待下去了。例如,如果希
望将 t2 合并到 t1 后, t1 只等待 100 毫秒,然后不论 t2 是否结束, t1 都继续执行,就可以在 t1
中加上语句:
t2.Join(100);
Join 方法通常和 Abort 一起使用。
由于调用某个线程的 Abort 方法后,我们无法确定系统清理代码的工作什么时候才能结
束,因此如果希望主线程调用了子线程的 Abort 方法后, 主线程不必一直等待, 可以调用子线
程的 Join 方法将子线程连接到主线程中,并在连接方法中指定一个最大等待时间,这样就能
使主线程继续执行了。
4. 让线程休眠
在多线程应用程序中, 有时候并不希望某一个线程继续执行, 而是希望该线程暂停一段时
间,等待其他线程执行之后再继续执行。这时可以调用 Thread 类的 Sleep 方法,即让线程休
眠。例如:
Thread.Sleep(1000);
这条语句的功能是让当前线程休眠 1000 毫秒。
注意,调用 Sleep 方法的是类本身,而不是类的实例。休眠的是该语句所在的线程,而不
是其他线程。
5. 线程优先级
当线程之间争夺 CPU 时间片时, CPU 是按照线程的优先级进行服务的。在 C#应用程序
中,可以对线程设定五个不同的优先级,由高到低分别是 Highest 、AboveNormal 、 Normal 、
BelowNormal 和 Lowest 。在创建线程时如果不指定其优先级,则系统默认为 Normal 。假如想
让一些重要的线程优先执行,可以使用下面的方法为其赋予较高的优先级:
Thread t=new Thread(new ThreadStart(enterpoint));
t.priority=ThreadPriority.AboveNormal;
通过设置线程的优先级可以改变线程的执行顺序, 所设置的优先级仅仅适用于这些线程所
属的进程。
注意,当把某线程的优先级设置为 Highest 时,系统上正在运行的其他线程都会终止,所
以使用这个优先级别时要特别小心。
6. 线程池
线程池是一种多线程处理形式, 为了提高系统性能, 在许多地方都要用到线程池技术。 例
如,在一个 C/S 模式的应用程序中的服务器端,如果每到一个请求就创建一个新线程,然后
在新线程中为其请求服务的话, 将不可避免的造成系统开销的增大。 实际上, 创建太多的线程
可能会导致由于过度使用系统资源而耗尽内存。 为了防止资源不足, 服务器端应用程序应采取
一定的办法来限制同一时刻处理的线程数目。
线程池为线程生命周期的开销问题和资源不足问题提供了很好的解决方案。 通过对多个任