首页 > 学院 > 开发设计 > 正文

线程系列01,前台线程,后台线程,线程同步

2019-11-17 02:52:54
字体:
来源:转载
供稿:网友

线程系列01,前台线程,后台线程,线程同步

在控制台应用程序集中,Main方法开始的是一个线程。如果要再创建线程,需要用到System.Threading这个命名空间。

□ 线程是怎样工作的?

CLR维护着一个叫"thread scheduler"的机制,这个机制与操作系统交互。"thread scheduler"保证所有的线程有合适的执行时间,那些等待或被阻塞的线程不会占有CPU时间。在单处理器计算机上,"thread scheduler"在几十毫秒的时间内切换当前线程的执行。在多处理器计算机上,"thread scheduler"一方面也会扮演在单处理器上的角色,此外,还会同时把不同的线程交给不同的CPU处理。值得注意的是:使用多线程并不是总是好的。

□ 线程和进程

一台运行的电脑上可能会有多个进程,一个运行的进程可能会有多个线程。进程之间是完全隔离的,但在同一应用程序中不同线程可以共享数据。线程之间可以协同工作,比如一个后台线程用来获取数据,当获取到数据之后,另一个线程用来显示数据。

□ 多线程的应用场景

○ 保持一个更快响应的UI界面:让UI线程只处理鼠标和键盘触发事件,其它线程处理其它事件。○ 有效利用CPU:一个线程被阻塞,该线程就不会占有CPU资源。○ 并行编程:执行一个比较耗时的任务时,可以分摊给多个线程。○ 投机执行:让一个有可能被执行的线程先提前执行;让不同的线程用不同的算法,最先得出结果的胜出。○ 请求被同步处理:无论是在客户端还是在服务端,可以用多线程同时处理多个并发请求。

□ 创建第一个线程

using System;
using System.Threading;
namespace Consoleapplication4
{
    class PRogram
    {
        static void Main(string[] args)
        {
            var thread = new Thread(DoSth);
            thread.Start();
        }
        static void DoSth()
        {
            Console.WriteLine("我来自另外一个线程");
        }
    }
}

实际上,new Thread(ThreadStart del)中的形参是委托类型:

public delegate void ThreadStart();

既然是委托,那在声明委托的时候,同样可以使用委托的构造函数:

var thread = new Thread(new ThreadStart (DoSth))

如果DoSth方法带参数,可以这样写:

var thread = new Thread(new ParameterizedThreadStart(DoSth));

□ 前台线程和后台线程

新建的线程在默认情况下是前台线程,可以通过把IsBackground属性设置为true,把线程定义为后台线程,一旦定义成后台线程,只要前台线程结束,无论后台线程是否结束,应用程序进程结束。

using System;
using System.Threading;
namespace ConsoleApplication4
{
    class Program
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表