版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
7.1线程的概念
7.2多线程程序设计
7.3多线程的状态处理
7.4线程的同步与共享7.1线 程 的 概 念线程,有时被称为轻量级进程(LightweightProcess,LWP),是程序执行流的最小单元。一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有运行中必需的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。每一个程序至少有一个线程,若程序只有一个线程,那就是程序本身。7.1.1线程、进程和多任务现在的操作系统都是多任务操作系统,每个运行的任务就是操作系统所做的一件事情,比如在听歌的同时还在用MSN和好友聊天。听歌和聊天就是两个任务,这个两个任务是“同时”进行的。一个任务一般对应一个进程,也可能包含好几个进程。比如运行的MSN就对应一个MSN的进程,如果用户使用的是Windows系统,就可以在任务管理器中看到操作系统正在运行的进程信息。一般来说,当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程。启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的。在进程中,有些程序流程块是可以乱序执行的,并且这个流程块可以同时被多次执行。实际上,这样的流程块就是线程体。线程是进程中乱序执行的代码流程。当多个线程同时运行的时候,这样的执行模式就成为并发执行。线程与进程的比较如下:(1)进程:每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大。(2)线程:即轻量的进程,同一类线程共享代码和数据空间。每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。(3)多进程:在操作系统中能同时运行多个任务程序。(4)多线程:在同一应用程序中有多个顺序流同时执行。7.1.2Java中的多线程多线程机制是Java语言的又一重要特征,使用多线程技术可以使系统同时运行多个执行体,这样可以加快程序的响应时间,提高计算机资源的利用率。使用多线程技术可以提高整个应用系统的性能。在Java中,创建线程有两种方法:一种是通过创建Thread类的子类来实现;另一种是通过实现Runnable接口的类来实现。7.2多线程程序设计7.2.1从Thread类继承从Thread类继承是创建一个线程较为简便的方法。在继承这个类之后,我们需要覆盖它的run方法,每一个线程都会分别执行一次run方法。下面程序是一个多线程的实例。在这个程序中有两个线程,每个线程都会执行一次run方法,但是两个线程执行的顺序并不固定,因此,输出谁先谁后都是随机的。程序后面是某一次运行的输出(注意每次运行都会不同)。注意,创建线程后,start方法用于启动线程。在一个方法中调用Thread.currentThread().getName()方法,可以获取当前线程的名字。在mian方法中调用该方法,获取的是主线程的名字。多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程。Thread.sleep()方法的调用目的是不让当前线程独自占有该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。7.2.2实现Runnable接口【示例7.2】通过接口构造线程体。publicclassClockextendsjava.applet.AppletimplementsRunnable{ //实现接口ThreadclockThread;publicvoidstart(){//该方法是Applet的方法不是线程的方法if(clockThread==null){clockThread=newThread(this,"Clock");/*线程体是Clock对象本身线程名字为"Clock"*/clockThread.start(); //启动线程}}
publicvoidrun(){ //run()方法中是线程执行的内容while(clockThread!=null){repaint(); //刷新显示画面try{clockThread.sleep(1000);//睡眠1秒即每隔1秒执行一次}catch(InterruptedExceptione){}}}publicvoidpaint(Graphicsg){Datenow=newDate();//获得当前的时间对象g.drawString(now.getHours()+":"+now.getMinutes()+":"+now.getSeconds(),5,10);//显示当前时间}publicvoidstop(){//该方法是Applet的方法不是线程的方法clockThread.stop();clockThread=null;}}以上示例是通过每隔1秒就执行线程的刷新画面功能来显示当前的时间;看起来的效果就是一个时钟每隔1秒就变化一次。由于采用的是实现接口Runnable的方式,所以该类Clock还继承了Applet,Clock就可以Applet的方式运行。构造线程体的两种方法的比较如下:(1)使用Runnable接口。①可以将CPU代码和数据分开,从而形成清晰的模型。②可以从其他类继承。③保持程序风格的一致性。(2)直接继承Thread类。①不能从其他类继承。②编写简单,可以直接操作线程无需使用Thread.currentThread()。7.3多线程的状态处理7.3.1线程的状态线程的状态可分为就绪、运行、阻塞、死亡等。就绪:当线程创建之后,调用start方法,自动运行run方法。此时,线程获得了系统资源,并处于等待CPU的状态。运行:线程获得了CPU资源。阻塞:处于运行状态的线程因为缺少某种资源而不得不停止运行,进入阻塞状态。死亡:线程的run方法运行结束时,线程进入死亡状态。7.3.2对线程状态的控制1.终止线程线程终止后其生命周期也就结束了,即进入死亡状态,终止后的线程不能再被调度执行。以下是进入死亡状态的几种情况线程:(1)线程执行完其run()方法后会自然终止。(2)通过调用线程的实例方法stop()来终止线程。2.测试线程状态可以通过Thread中的isAlive()方法来获取线程是否处于活动状态。3.线程的暂停和恢复有几种方法可以暂停一个线程的执行,并在适当的时候再恢复其执行。(1) sleep()方法。当前线程睡眠(停止执行),即若干毫秒线程由运行中状态,进入不可运行状态,停止执行时间到后线程进入可运行状态。(2) suspend()和resume()方法。线程的暂停和恢复通过调用线程的suspend()方法使线程暂时由可运行态切换到不可运行态,若此线程想再回到可运行态,必须由其他线程调用resume()方法来实现。注:从JDK1.2开始就不再使用suspend()和resume()。(3) join()方法。当前线程等待调用该方法的线程结束后,再恢复执行。7.4线程的同步与共享因为多线程提供了程序的异步执行的功能,可能会出现两个或多个线程同时访问共享资源,所以在必要时还必须提供一种同步机制。线程同步可以确保当两个或多个线程需要访问共享资源时,一次只有一个线程使用资源。7.4.1线程的同步1.线程的同步机制在Java中,使用synchronized关键字修饰的方法称为同步方法。当某一线程在一个同步方法中执行的时候,其他所有企图调用同步方法的线程或者其他方法都必须等待。在Java中使用synchronized的两种方式如下:(1)放在方法前面,这样调用该方法的线程均将获得对象的锁。(2)放在代码块前面,它也有以下两种形式:synchronized(this){…}:代码块中的代码将获得当前对象引用的锁。synchronized(otherObj){…}:代码块中的代码将获得指定对象引用的锁。2.死锁线程系统还存在一个更大的风险,即“死锁”。死锁是保护数据不受线程损坏的自然结果。如果共享资源有状态,而且在多个线程处于活动状态时更改代码块的状态,则当多个线程运行时,就可能会潜在地破坏资源状态。线程是独立调度的,不一定按固定顺序运行,这必然存在风险。要解决这个问题,应将数据设置为私有,并同步代码块。但是,如果在应用程序中定义同步代码,则可能出现死锁。具体地讲,对于两个已经有锁标记的线程而言,如果它们都试图调用受另一个线程的锁标记保护的同步代码,则可能出现死锁。在出现死锁时,两个线程将永不能再运行。另外,调用使用相同锁标记的方法的其他线程也将出现死锁。当以下四个条件同时满足时,就会发生死锁:(1)互斥条件。线程使用的资源中至少有一个是不能共享的。(2)至少有一个进程必须有一个资源且正在等待获取一个当前被别的进程持有的资源。(3)资源不能被进程抢占。所有的进程必须把资源释放当作普通事件。(4)必须有循环等待。一个进程等待其他进程所持有的资源,这时,后者又在等待另一个进程所持有的资源,这样直到有一个进程在等待第一个进程所持有的资源,使大家都被锁住。所以,要防止死锁发生,只需破坏其中一个条件即可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 银行基础知识试题及答案展示
- 标本处置职业暴露预防
- 数学二冲刺试卷(2026考研全国统考·高频考点)
- 实验动物专项试题及答案大全
- 2024年全国统考数学一考点精练(真题逐题精讲)
- 考研数学三历年真题全套-2025(完整版)
- 颅脑损伤的抢救流程
- 登革热多部门联防联控机制优化课件
- 《中国骨质疏松症防治指南》解读
- 2026秋新教材湘科版小学科学五年级上册第二单元《热的传递》同步练习(附答案)
- 电化学测量方法
- 2026年上海市安全员C3证模拟试题及答案
- 2026年长沙电力职业技术学院单招职业技能考试题库及参考答案详解一套
- 工业产品生产许可证实施细则通则
- 2026年艾灸调理女性问题养生课件
- GB/T 6113.203-2025无线电骚扰和抗扰度测量设备和测量方法规范第2-3部分:无线电骚扰和抗扰度测量方法辐射骚扰测量
- 2025国家基层糖尿病防治管理指南培训考试题库及答案
- 水利工程监理实施细则范本(2025版水利部)
- 雨课堂学堂在线学堂云《中国旅游概论(北京第二外国语学院)》单元测试考核答案
- 2025年广东省广州市员额检察官遴选考试真题及答案
- 2026年肥胖患者的长期体重管理及药物临床应用指南
评论
0/150
提交评论