第9章 多线程 王德俊 上海交通大学继续教育学院
第9章 多线程 9.1 线程及其实现方法 9.2 线程的同步控制
9.1 线程及其实现方法 9.1.1 线程的概念 9.1.2 线程的实现方法 9.1.3 线程的优先级
现代操作系统一般支持多线程,一个进程又可以由多个执行 单元,即多个线程组成。 9.1 线程及其实现方法 9.1.1 线程的概念 线程的概念与程序、进程的概念密切相关。 程序是程序员编写的静态代码文本。 进程则是程序的一次动态执行过程 同一个程序,可以被多次加载到不同的内存区域中、使用不同的机器 资源,从而形成多个不同的进程 现代操作系统一般支持多线程,一个进程又可以由多个执行 单元,即多个线程组成。 每个线程都共享着其进程所占用的内存空间和机器资源(如堆栈、 CPU、寄存器等) 实际上,一个线程是一组机器指令以及它共享的内存和资源。
线程和进程的主要区别: 9.1.1 线程的概念(续) 进程是由多个线程组成,即线程是进程的一个组成部分。 9.1 线程及其实现方法 9.1.1 线程的概念(续) 线程和进程的主要区别: 进程是由多个线程组成,即线程是进程的一个组成部分。 线程的划分尺度小,具有较高的并发效率。 进程独占相应的内存和资源,进程间切换需要切换资源;同一进程的 多个线程则是共享该进程所拥有的内存和资源,线程间切换开销小。 进程提供多个线程执行控制,而每个线程只能有一个运行入口、顺序 执行序列和出口(“线序”执行)。 线程不能独立执行,而必须依赖于进程所提供的环境。
线程的创建和应用主要是由Thread类和ThreadStart委托来实现。 Thread类的构造函数: 9.1 线程及其实现方法 9.1.2 线程的实现方法 线程的创建和应用主要是由Thread类和ThreadStart委托来实现。 Thread类的构造函数: (1)构造函数:用于创建线程,主要有两个重载版本: public Thread(ThreadStart start) //该构造函数创建的线程关联没有参数的方法 public Thread(ParameterizedThreadStart start) //该构造函数创建的线程关联带一个object类型参数的方法 (2)每个线程都必须关联一个无返回类型的方法(称为线程方法), 如果关联的方法无参数,则用第一个构造函数创建线程;如果关联的 方法带一个参数,则用第二个构造函数创建线程。
9.1.2 线程的实现方法(续) (3)构造函数中,参数start是ThreadStart类型或ParameterizedThreadStart 类型的变量。 (4)这两种委托类型的声明如下: public delegate void ThreadStart() public delegate void ParameterizedThreadStart(Object obj) (5)线程关联的方法必须与所使用的委托类型相一致,返回类型必须为 void,且在创建委托对象时关联的方法必须是已经确定了的。这些方法通 常是类的静态方法和对象的方法。
实现方法举例: 9.1.2 线程的实现方法 下面代码先定义类A,它有两个静态方法f()和g(), g()带有object类型的参数obj: 9.1 线程及其实现方法 9.1.2 线程的实现方法 实现方法举例: 下面代码先定义类A,它有两个静态方法f()和g(), g()带有object类型的参数obj: class A { public static void f() Console.WriteLine("这是关联方法f()的线程"); } public static void g(object obj) Console.WriteLine("这是关联方法g()的线程:"+obj.ToString());
通过委托类型ThreadStart和ParameterizedThreadStart关联方法f()和g() 9.1 线程及其实现方法 9.1.2 线程的实现方法 通过委托类型ThreadStart和ParameterizedThreadStart关联方法f()和g() ThreadStart thst = new ThreadStart(A.f); ParameterizedThreadStart pthst = new ParameterizedThreadStart(A.g); 创建线程th1和th2,并执行它们: Thread th1 = new Thread(thst); //关联方法f() Thread th2 = new Thread(pthst); //关联方法g(),带一个参数 th1.Start(); //启动线程th1(执行方法f()) th2.Start(200); //启动线程th2(执行方法g(),并将200作为参数值传给该方法)
9.1 线程及其实现方法 9.1.2 线程的实现方法 输出结果: 这是关联方法f()的线程 这是关联方法g()的线程:200
Thread类的主要方法 Start()方法 Abort()方法 该方法用于启动已经创建的线程,线程将进入Running状态(线程刚创 建完时是处于Unstarted状态)。 如启动线程th1的语句是:th1.Start(); Abort()方法 该方法用于终止线程,使线程进入Aborted状态。 如终止线程th的语句是:th.Abort();
Thread类的主要方法 Suspend()方法和Resume()方法 Join()方法 Suspend()方法用于挂起线程,使线程进入Suspended状态; Resume()方法则用于将被挂起的线程重新工作,使得它进入Running状 态。 Join()方法 假设在线程th1中对线程th2执行下列语句: th2.Join();表示将阻止线程th1的执行,直到th2执行完为止(才继续执行 th1)。 th2.Join(500); 表示阻止线程th1,直到500毫秒以后th1才运行:
Thread类的主要属性 CurrentThread属性 IsBackground属性 获取当前正在运行的线程。 该属性用于获取或设置指示当前线程是否为后台线程。 值为true时表示为后台线程,这时该线程随着主进程的结束而结束, 而不管该线程是否已经运行结束; 值为false(默认值)时表示为前台线程,只有所有的前台线程运 行结束后,主线程才能终止。
Thread类的主要属性 ManagedThreadId属性 Name属性 ThreadState属性 获取当前托管线程的唯一标识符。 获取或设置线程的名称。 ThreadState属性 返回当前线程的状态。线程的状态包括Running、StopRequested、 SuspendRequested、Background、Unstarted、Stopped、WaitSleepJoin、 Suspended、AbortRequested和Aborted。
线程的优先级是用Thread类的Priority属性来设置 9.1 线程及其实现方法 9.1.3 线程的优先级 线程的优先级是用Thread类的Priority属性来设置 其值集是一个枚举,即{Lowest, BelowNormal, Normal, AboveNormal, Highest},优先级别依次从低到高 Priority属性的默认设置是ThreadPriority.Normal。 说明:操作系统并不能够保证拥有高优先级的线程每次都能 够获得比低优先级线程更高执行权限,这跟操作系统的调度 算法有关。
本讲小结 线程的概念 线程的实现方法 线程的优先级