




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章HappyChat线程技术应用 学习目的与要求 深刻理解线程的概念 线程与进程的区别深刻理解线程的状态熟练使用Thread创建线程熟练使用Runnable接口创建线程学习难点 深刻理解线程的概念 线程与进程的区别学习重点 使用Thread创建线程使用Runnable接口创建线程 11 1HappyChat线程技术应用分析11 2线程概述11 3创建和启动线程11 4线程的状态11 5调度线程11 6线程的同步与死锁11 7本章小结11 8上机实训 第11章HappyChat线程技术应用 11 1HappyChat线程技术应用分析 HappyChat聊天系统的线程应用主要体现在以下几个方面 客户 服务器通信在HappyChat聊天系统中 每个用户的注册请求和登录请求通过网络向服务器发送 同时 每一个用户的请求都要求服务器端能够进行响应 聊天服务器就是通过多线程来即时响应多个客户端的实时请求聊天界面时间的同步显示用户在聊天时需要和其他用户进行消息的传递 这是利用一个线程来完成的 如果在聊天的同时还需要实时显示当前时间 这就需要另外一个线程负责时间的显示和动态刷新 11 2线程概述 线程与多线程在现代操作系统中 进程被认为是系统资源分配和独立运行的基本单位 图11 1线程结构示意图 线程与进程的区别每个进程都有独立的代码和数据空间 进程上下文 进程切换的开销大 而多线程是共享一块内存空间和一组系统资源 有可能互相影响 线程本身的数据通常只有寄存器数据 以及一个程序执行时使用的堆栈 所以线程的切换比进程切换n的负担要小 线程自身不能够自动运行 必须栖身于某一进程中 由进程触发 对线程的综合支持是Java技术的一个重要特色 Java语言把线程或执行环境当作一种拥有自己的程序代码和数据的对CPU的封装单位 由虚拟机提供控制 它提供了thread类 监视器和条件变量的技术 虽然Macintosh WindowsNT Windows9等操作系统支持多线程 但若要用C或C 编写多线程程序是很困难的 因为它们对数据同步的支持不充分 11 3创建和启动线程 Thread类 实例11 1 继承Thread类构造线程体 1 实例场景 运用线程技术 设计图形用户界面 通过挂起 重起按钮控制显示系统时间 2 实例编码 继承Thread类线程演示importjava awt importjava awt event importjavax swing importjava lang importjava util 通过继承Thread类创建线程publicclassThreadDemoextendsJFrameimplementsActionListener JPanelpnlMain staticJLabellblMove JButtonbtnControl 声明一个显示当前时间的线程CurrentTimect Thread类 例11 1 继承Thread类构造线程体 publicThreadDemo super 继承Thread类线程演示 pnlMain newJPanel newGridLayout 2 1 setContentPane pnlMain lblMove newJLabel lblMove setFont newFont 宋体 Font BOLD 22 lblMove setForeground Color RED btnControl newJButton 挂起 btnControl addActionListener this pnlMain add lblMove pnlMain add btnControl 构造线程对象并让它处于运行状态ct newCurrentTime ct start setSize 250 150 setVisible true setResizable false setDefaultCloseOperation EXIT ON CLOSE Thread类 例11 1 继承Thread类构造线程体 实现ActionListener接口必须实现的方法publicvoidactionPerformed ActionEventae if ae getActionCommand 挂起 btnControl setText 重启 ct suspend if ae getActionCommand 重启 btnControl setText 挂起 ct resume publicstaticvoidmain Stringargs ThreadDemotd newThreadDemo Thread类 例11 1 继承Thread类构造线程体 独立的一个显示当前时间的线程类classCurrentTimeextendsThread DatedateDisplay GregorianCalendargcCalendar StringstrTime publicCurrentTime 继承Thread类必须实现的run方法publicvoidrun while true displayTime try this sleep 1000 catch InterruptedExceptione JOptionPane showMessageDialog null 线程中断 Thread类 例11 1 继承Thread类构造线程体 显示当前日期和时间的函数publicvoiddisplayTime dateDisplay newDate gcCalendar newGregorianCalendar 获得当前时间gcCalendar setTime dateDisplay 从当前时间中提取日期段和时间段strTime 当前时间 gcCalendar get Calendar HOUR gcCalendar get Calendar MINUTE gcCalendar get Calendar SECOND 显示当前日期和时间ThreadDemo lblMove setText strTime 3 知识点 多线程的实现方法 编写多线程程序需要创建线程 线程的创建包括定义线程体和创建线程对象两个方面的内容 线程的行为由线程体决定 线程体是由run 方法定义的 运行系统通过调用run 方法实现线程的具体行为 可以通过继承Thread类或实现Runnable接口这两种途径来构造自己的run 方法 在Java语言中 若创建了一个Thread类 多数情况是其子类 的实例对象 就形成了一个新的线程 运行线程的执行代码书写在run 方法中 通过调用线程对象的不同方法 可以控制线程的启动 暂时挂起 终止等 下面是一些常用线程类的方法 3 知识点 继承Thread类 可通过继承Thread类并重写其中的run 方法来定义线程体以实现线程的具体行为 然后创建该子类的对象以创建线程 在继承Thread类的子类ThreadSubclassName中重写run 方法来定义线程体的一般格式为 publicclassThreadSubclassNameextendsThread publicThreadSubclassName 编写子类的构造方法 可缺省 publicvoidrun 编写自己的线程代码 用定义的线程子类ThreadSubclassName创建线程对象的一般格式为 ThreadSubclassNameThreadObject newThreadSubclassName 然后 就可启动该线程对象表示的线程 ThreadObject start 启动线程 3 知识点Thread类构造方法 Runnable接口 实例11 2 实现Runnable接口构造线程体 1 实例场景 运用线程技术 设计图形用户界面 通过挂起 重起按钮控制显示系统日期 系统时间 2 实例编码 通过实现Runnable接口创建线程演示程序importjava awt importjava awt event importjavax swing importjava lang importjava util publicclassRunnableDemoextendsJFrameimplementsRunnable ActionListener JPanelpnlMain JLabellblTime JButtonbtnControl ThreadthdDisplayTime DatedateDisplay GregorianCalendargcCalendar StringstrDate strTime publicRunnableDemo super 实现Runnable接口线程演示 pnlMain newJPanel newGridLayout 2 1 setContentPane pnlMain lblTime newJLabel btnControl newJButton 挂起 btnControl addActionListener this pnlMain add lblTime pnlMain add btnControl thdDisplayTime newThread this thdDisplayTime start setSize 250 150 setVisible true setResizable false setDefaultCloseOperation EXIT ON CLOSE publicvoidrun while thdDisplayTime null displayTime try thdDisplayTime sleep 1000 catch InterruptedExceptione JOptionPane showMessageDialog null 线程中断 publicvoidactionPerformed ActionEventae if ae getActionCommand 挂起 btnControl setText 重启 thdDisplayTime suspend if ae getActionCommand 重启 btnControl setText 挂起 thdDisplayTime resume publicvoiddisplayTime dateDisplay newDate gcCalendar newGregorianCalendar gcCalendar setTime dateDisplay strTime 当前时间 gcCalendar get Calendar HOUR gcCalendar get Calendar MINUTE gcCalendar get Calendar SECOND strDate 今天日期 gcCalendar get Calendar YEAR gcCalendar get Calendar MONTH 1 gcCalendar get Calendar DATE lblTime setText strDate strTime publicstaticvoidmain Stringargs RunnableDemord newRunnableDemo 3 知识点 多线程的实现方法 11 4线程的状态 一个线程在它的完整的生命周期中有4种状态 新建 运行 不可运行和死亡状态New 新建状态 当线程被创建并还未调用start方法时 线程处于 new 状态 Runnable 运行状态 对于新创建的线程 调用start方法之后 会自动调用run方法 这时 线程进入 runnable 状态NotRunning 不可运行状态 由于某些原因 线程被临时暂停 则进入 notrunning 状态Dead 死亡状态 当线程不再需要则进入 dead 状态 死亡的线程不能再恢复和执行 11 4线程的状态 续 一个线程在它的完整的生命周期中有4种状态 新建 运行 不可运行和死亡状态 图11 2线程状态示意 例11 3 线程状态 线程状态演示程序 引入包 同 例11 1 publicclassThreadStatusDemoextendsJFrameimplementsActionListener JPanelpnlMain staticJLabellblMove JButtonbtnControl btnStart btnSleep btnDead 声明一个显示当前时间的线程CurrentTimect publicThreadStatusDemo super 线程状态演示 pnlMain newJPanel setContentPane pnlMain lblMove newJLabel lblMove setFont newFont 宋体 Font BOLD 22 lblMove setForeground Color RED btnStart newJButton 开始 btnStart addActionListener this btnSleep newJButton 睡眠 btnSleep addActionListener this btnDead newJButton 结束 btnDead addActionListener this btnControl newJButton 挂起 btnControl addActionListener this pnlMain add lblMove pnlMain add btnStart pnlMain add btnSleep pnlMain add btnControl pnlMain add btnDead setSize 250 150 setVisible true setResizable false setDefaultCloseOperation EXIT ON CLOSE 实现ActionListener接口必须实现的方法publicvoidactionPerformed ActionEventae if ae getSource btnStart 构造线程对象并通过start方法让它处于运行状态ct newCurrentTime ct start if ae getActionCommand 挂起 通过suspend方法挂起线程 进入不可运行状态btnControl setText 重启 ct suspend if ae getActionCommand 重启 通过resume方法重新启动线程btnControl setText 挂起 ct resume if ae getSource btnSleep try 通过sleep方法让线程进入睡眠状态ct sleep 3000 catch Exceptione JOptionPane showMessageDialog null 线程错误 if ae getSource btnDead 通过stop方法将线程杀死ct stop publicstaticvoidmain Stringargs ThreadStatusDemotd newThreadStatusDemo CurrentTime类 同 例11 1 11 5调度线程 线程的优先级每一个线程都有一个优先级 缺省情况下线程的优先级为5 最高的优先级为10 最低的优先级为1当前线程放弃CPU的情况在下面几种情况下 当前线程会放弃CPU 线程调用了yield suspend 或sleep 方法 由于当前线程进行I O访问 外存读写 等待用户输入等操作 导致线程阻塞 为等候一个条件变量 线程调用wait 方法 例11 4 线程调度 线程调度演示程序publicclassThreadPriorityDemo publicstaticvoidmain Stringargs Threadt1 newMyThread 线程1 t1 setPriority Thread MIN PRIORITY 设置优先级为最小t1 start Threadt2 newMyThread 线程2 t2 setPriority Thread NORM PRIORITY 设置优先级为普通t2 start Threadt3 newMyThread 线程3 t3 setPriority Thread MAX PRIORITY 设置优先级为最大t3 start classMyThreadextendsThread StringstrMsg MyThread Stringmessage this strMsg message publicvoidrun for inti 0 i 3 i 获得线程的优先级System out println strMsg getPriority 11 6线程的同步与死锁 例11 5 线程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离婚股权分割与夫妻共同财产分割执行监督协议
- 离婚协议中共同债务清偿及信用记录保护的合同
- 科技园区个人商铺租赁及科技创新服务合同
- 夫妻共同债务清算及财产分割协议书范本
- 离婚协议范本:离婚财产分割与子女监护权争议处理
- 租赁设备押金合同范本(含设备操作及维护责任)
- 气泡膜买卖合同3篇
- 离婚协议书范文模板格式6篇
- 印刷安全防护技术集成-洞察及研究
- 二次翻料合同5篇
- 静脉导管常见并发症临床护理实践指南1
- 启东事业单位考试真题2022
- 导尿术导尿术课件
- 燃气轮机控制系统
- 规划用地性质调整论证报告
- 法考客观题历年真题及答案解析卷二(第3套)
- YS/T 261-2011锂辉石精矿
- 公路水运项目危大工程专项方案技术培训课件
- 五大连池市财政资金支出审批管理办法
- 货币与金融统计学课件
- 《资本论》解读课件
评论
0/150
提交评论