Presentation is loading. Please wait.

Presentation is loading. Please wait.

第9章 多线程 王德俊 上海交通大学继续教育学院.

Similar presentations


Presentation on theme: "第9章 多线程 王德俊 上海交通大学继续教育学院."— Presentation transcript:

1 第9章 多线程 王德俊 上海交通大学继续教育学院

2 第9章 多线程 9.1 线程及其实现方法 9.2 线程的同步控制

3 9.1 线程及其实现方法 9.1.1 线程的概念 9.1.2 线程的实现方法 9.1.3 线程的优先级

4 现代操作系统一般支持多线程,一个进程又可以由多个执行 单元,即多个线程组成。
9.1 线程及其实现方法 9.1.1 线程的概念 线程的概念与程序、进程的概念密切相关。 程序是程序员编写的静态代码文本。 进程则是程序的一次动态执行过程 同一个程序,可以被多次加载到不同的内存区域中、使用不同的机器 资源,从而形成多个不同的进程 现代操作系统一般支持多线程,一个进程又可以由多个执行 单元,即多个线程组成。 每个线程都共享着其进程所占用的内存空间和机器资源(如堆栈、 CPU、寄存器等) 实际上,一个线程是一组机器指令以及它共享的内存和资源。

5 线程和进程的主要区别: 9.1.1 线程的概念(续) 进程是由多个线程组成,即线程是进程的一个组成部分。
9.1 线程及其实现方法 9.1.1 线程的概念(续) 线程和进程的主要区别: 进程是由多个线程组成,即线程是进程的一个组成部分。 线程的划分尺度小,具有较高的并发效率。 进程独占相应的内存和资源,进程间切换需要切换资源;同一进程的 多个线程则是共享该进程所拥有的内存和资源,线程间切换开销小。 进程提供多个线程执行控制,而每个线程只能有一个运行入口、顺序 执行序列和出口(“线序”执行)。 线程不能独立执行,而必须依赖于进程所提供的环境。

6 线程的创建和应用主要是由Thread类和ThreadStart委托来实现。 Thread类的构造函数:
9.1 线程及其实现方法 9.1.2 线程的实现方法 线程的创建和应用主要是由Thread类和ThreadStart委托来实现。 Thread类的构造函数: (1)构造函数:用于创建线程,主要有两个重载版本: public Thread(ThreadStart start) //该构造函数创建的线程关联没有参数的方法 public Thread(ParameterizedThreadStart start) //该构造函数创建的线程关联带一个object类型参数的方法 (2)每个线程都必须关联一个无返回类型的方法(称为线程方法), 如果关联的方法无参数,则用第一个构造函数创建线程;如果关联的 方法带一个参数,则用第二个构造函数创建线程。

7 9.1.2 线程的实现方法(续) (3)构造函数中,参数start是ThreadStart类型或ParameterizedThreadStart 类型的变量。 (4)这两种委托类型的声明如下: public delegate void ThreadStart() public delegate void ParameterizedThreadStart(Object obj) (5)线程关联的方法必须与所使用的委托类型相一致,返回类型必须为 void,且在创建委托对象时关联的方法必须是已经确定了的。这些方法通 常是类的静态方法和对象的方法。

8 实现方法举例: 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());

9 通过委托类型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作为参数值传给该方法)

10 9.1 线程及其实现方法 9.1.2 线程的实现方法 输出结果: 这是关联方法f()的线程 这是关联方法g()的线程:200

11 Thread类的主要方法 Start()方法 Abort()方法
该方法用于启动已经创建的线程,线程将进入Running状态(线程刚创 建完时是处于Unstarted状态)。 如启动线程th1的语句是:th1.Start(); Abort()方法 该方法用于终止线程,使线程进入Aborted状态。 如终止线程th的语句是:th.Abort();

12 Thread类的主要方法 Suspend()方法和Resume()方法 Join()方法
Suspend()方法用于挂起线程,使线程进入Suspended状态; Resume()方法则用于将被挂起的线程重新工作,使得它进入Running状 态。 Join()方法 假设在线程th1中对线程th2执行下列语句: th2.Join();表示将阻止线程th1的执行,直到th2执行完为止(才继续执行 th1)。 th2.Join(500); 表示阻止线程th1,直到500毫秒以后th1才运行:

13 Thread类的主要属性 CurrentThread属性 IsBackground属性 获取当前正在运行的线程。
该属性用于获取或设置指示当前线程是否为后台线程。 值为true时表示为后台线程,这时该线程随着主进程的结束而结束, 而不管该线程是否已经运行结束; 值为false(默认值)时表示为前台线程,只有所有的前台线程运 行结束后,主线程才能终止。

14 Thread类的主要属性 ManagedThreadId属性 Name属性 ThreadState属性 获取当前托管线程的唯一标识符。
获取或设置线程的名称。 ThreadState属性 返回当前线程的状态。线程的状态包括Running、StopRequested、 SuspendRequested、Background、Unstarted、Stopped、WaitSleepJoin、 Suspended、AbortRequested和Aborted。

15 线程的优先级是用Thread类的Priority属性来设置
9.1 线程及其实现方法 9.1.3 线程的优先级 线程的优先级是用Thread类的Priority属性来设置 其值集是一个枚举,即{Lowest, BelowNormal, Normal, AboveNormal, Highest},优先级别依次从低到高 Priority属性的默认设置是ThreadPriority.Normal。 说明:操作系统并不能够保证拥有高优先级的线程每次都能 够获得比低优先级线程更高执行权限,这跟操作系统的调度 算法有关。

16 本讲小结 线程的概念 线程的实现方法 线程的优先级


Download ppt "第9章 多线程 王德俊 上海交通大学继续教育学院."

Similar presentations


Ads by Google