资源预览内容
第1页 / 共55页
第2页 / 共55页
第3页 / 共55页
第4页 / 共55页
第5页 / 共55页
第6页 / 共55页
第7页 / 共55页
第8页 / 共55页
第9页 / 共55页
第10页 / 共55页
亲,该文档总共55页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第1010章章 线程线程第第1010章章 线程线程n n10.1 10.1 线程的概念线程的概念 n n10.2 10.2 线程的创建线程的创建n n10.3 10.3 线程的生命周期及调度线程的生命周期及调度 n n10.4 10.4 线程互斥线程互斥 n n10.5 10.5 线程同步线程同步 n n10.6 10.6 线程通讯线程通讯 n n10.7 10.7 线程死锁线程死锁 10.1 10.1 线程的概念线程的概念 进程和线程的概念进程和线程的概念: : 随着计算机的飞速发展,个人计算机上的操作系统也纷随着计算机的飞速发展,个人计算机上的操作系统也纷 纷采用多任务和分时设计,将早期只有大型计算机才具有的纷采用多任务和分时设计,将早期只有大型计算机才具有的 系统特性带到了个人计算机系统中。一般可以在同一时间内系统特性带到了个人计算机系统中。一般可以在同一时间内 执行多个程序的操作系统都有进程的概念。执行多个程序的操作系统都有进程的概念。一个进程就是一一个进程就是一 个执行中的程序,而每一个进程都有自己独立的一块内存空个执行中的程序,而每一个进程都有自己独立的一块内存空 间、一组系统资源间、一组系统资源。在进程概念中,每一个进程的内部数据。在进程概念中,每一个进程的内部数据 和状态都是完全独立的。和状态都是完全独立的。JavaJava程序通过流控制来执行程序流程序通过流控制来执行程序流 ,程序中单个顺序的流控制称为线程,多线程则指的是在单,程序中单个顺序的流控制称为线程,多线程则指的是在单 个程序中可以同时运行多个不同的线程,执行不同的任务。个程序中可以同时运行多个不同的线程,执行不同的任务。 多线程意味着一个程序的多行语句可以看上去几乎在同一时多线程意味着一个程序的多行语句可以看上去几乎在同一时 间内同时运行。间内同时运行。线程的概念线程的概念线程与进程的区别线程与进程的区别线程与进程相似,是一段完成某个特定功能的代码,是程序线程与进程相似,是一段完成某个特定功能的代码,是程序 中单个顺序的流控制;但与进程不同的是,同类的多个线程共享中单个顺序的流控制;但与进程不同的是,同类的多个线程共享 一块内存空间和一组系统资源,而线程本身的数据通常只有微处一块内存空间和一组系统资源,而线程本身的数据通常只有微处 理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系 统在产生一个线程,或者在各个线程之间切换时,负担要比进程统在产生一个线程,或者在各个线程之间切换时,负担要比进程 小的多,正因如此,线程被称为轻负荷进程(小的多,正因如此,线程被称为轻负荷进程(light-weight light-weight processprocess)。一个进程中可以包含多个线程。一个线程是一个程序)。一个进程中可以包含多个线程。一个线程是一个程序 内部的顺序控制流。主要区别如下:内部的顺序控制流。主要区别如下:1. 1. 进程:每个进程都有独立的代码和数据空间(进程上下文进程:每个进程都有独立的代码和数据空间(进程上下文 ) ,进程切换的开销大。,进程切换的开销大。 2. 2. 线程:轻量的进程,同一类线程共享代码和数据空间,每线程:轻量的进程,同一类线程共享代码和数据空间,每 个线程有独立的运行栈和程序计数器(个线程有独立的运行栈和程序计数器(PCPC),线程切换的开销小),线程切换的开销小 。 3. 3. 多进程:在操作系统中,能同时运行多个任务程序。多进程:在操作系统中,能同时运行多个任务程序。 4. 4. 多线程:在同一应用程序中,有多个顺序流同时执行。多线程:在同一应用程序中,有多个顺序流同时执行。1) 一个虚拟处理机2) CPU执行的代码3)代码操作的数据代码可以或不可以由多个线 程共享,这时数据是独立的。 两个线程如果执行同一个类的 实例代码,则它们可以共享相 同的代码。类似地,数据可以或不可以 由多个线程共享,这时代码是 独立的。两个线程如果共享对 一个公共对象的存取,则它们 可以共享相同的数据。 一个线程由三个主要部分组成:10.1 10.1 线程的概念线程的概念n n使用多线程进行程序设计具有如下优点:使用多线程进行程序设计具有如下优点:1 1)多线程编程简单,效率高(能直接共享数据和资源,多多线程编程简单,效率高(能直接共享数据和资源,多 进程不能)进程不能)2) 2)适合于开发服务程序(如适合于开发服务程序(如WebWeb服务,聊天服务等)服务,聊天服务等)3) 3)适合于开发有多种交互接口的程序(如聊天程序的客户端适合于开发有多种交互接口的程序(如聊天程序的客户端 ,网络下载工具),网络下载工具)4)4)减轻编写交互频繁、涉及面多的程序的困难(如监听网络减轻编写交互频繁、涉及面多的程序的困难(如监听网络 端口)端口)5)5)程序的吞吐量会得到改善(同时监听多种设备,如网络端程序的吞吐量会得到改善(同时监听多种设备,如网络端 口、串口、并口以及其他外设)口、串口、并口以及其他外设)6) 6)有多个处理器的系统,可以并发运行不同的线程(否则,有多个处理器的系统,可以并发运行不同的线程(否则, 任何时刻只有一个线程在运行)任何时刻只有一个线程在运行)线程举例:线程举例:n nHotjava Hotjava浏览器就是一个多线程应用的实例。当浏览器就是一个多线程应用的实例。当 下载一个应用程序或图片时,可以同时进行其他任下载一个应用程序或图片时,可以同时进行其他任 务,例如播放动画或声音的应用程序、打印某些内务,例如播放动画或声音的应用程序、打印某些内 容、进行排序或者其他工作。容、进行排序或者其他工作。n n聊天室(多人同时聊)聊天室(多人同时聊)n nWeb Web服务器服务器 , ,如:如:Tomcat Tomcat、ResinResin、WebSphereWebSpheren n数据库系统,如:数据库系统,如:MSSQLServerMSSQLServer、OracleOracle10.210.2线程的创建线程的创建 n n10.2.1 10.2.1 采用继承创建线程采用继承创建线程 n n10.2.1 10.2.1 通过实现接口创建线程通过实现接口创建线程 ThreadThread类有很多重载的构造方法:类有很多重载的构造方法:n nThread() Thread() n nThread(Runnable target) Thread(Runnable target) n nThread(Runnable target, String name) Thread(Runnable target, String name) n nThread(String name) Thread(String name) n nThread(ThreadGroup group, Runnable target) Thread(ThreadGroup group, Runnable target) n nThread(ThreadGroup group , Runnable target, String Thread(ThreadGroup group , Runnable target, String name)name)n nThread(ThreadGroup group , String name) Thread(ThreadGroup group , String name) 参数参数targettarget是线程执行的目标对象,即线程执行的代码;是线程执行的目标对象,即线程执行的代码; groupgroup是线程所在的组;是线程所在的组;namename是线程的名字。是线程的名字。创建线程两种主要的方法:一种是继承创建线程两种主要的方法:一种是继承ThreadThread;另一种是实现接口;另一种是实现接口 RunnableRunnable。可以根据具体的应用环境进行选择。可以根据具体的应用环境进行选择。下面介绍:下面介绍:ThreadThread类的常用方法,参见类的常用方法,参见JDK APIJDK API10.2.1 10.2.1 采用继承创建线程采用继承创建线程n n该方法比较简单,主要是通过继承该方法比较简单,主要是通过继承 java.lang.Threadjava.lang.Thread类,并覆盖类,并覆盖ThreadThread类的类的runrun()() 方法来完成线成的创建。方法来完成线成的创建。Thread Thread 类是一个具体的类是一个具体的 类,即不是抽象类,该类封装了线程的行为。要创类,即不是抽象类,该类封装了线程的行为。要创 建一个线程,程序员必须创建一个从建一个线程,程序员必须创建一个从 Thread Thread 类导类导 出的新类。出的新类。ThreadThread类中有两个最重要的函数类中有两个最重要的函数run()run() 和和start()start()。 10.2.1 10.2.1 采用继承创建线程采用继承创建线程public class MyThread extends Threadpublic class MyThread extends Thread / count / count变量用于统计打印的次数并共享变量变量用于统计打印的次数并共享变量 private static int count = 0;private static int count = 0; public MyThread(String name)super(name);public MyThread(String name)super(name); public static void main(String args)/ mainpublic static void main(String args)/ main方法开始方法开始 MyThread p = new MyThread(“t1“); / MyThread p = new MyThread(“t1“); / 创建一个线程实例创建一个线程实例 p.start(); / p.start(); / 执行线程执行线程 / / 主线程主线程mainmain方法执行一个循环方法执行一个循环 for (int i = 0; i = 100) if(acount.balance = 100)try trysleep(delay); sleep(delay);acount.balance = acount.balance - 100; acount.balance = acount.balance - 100;System.out.println(“withdraw System.out.println(“withdraw 100 100 successful!“);successful!“);catch(InterruptedException e) catch(InterruptedException e) else elseSystem.out.println(“withdraw failed!“); System.out.println(“withdraw failed!“); 10.4.110.4.1问题的提出问题的提出public static void main(String args) public static void main(
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号