《Java高级编程》PPT课件.ppt

上传人:sh****n 文档编号:6611275 上传时间:2020-02-29 格式:PPT 页数:23 大小:208.55KB
返回 下载 相关 举报
《Java高级编程》PPT课件.ppt_第1页
第1页 / 共23页
《Java高级编程》PPT课件.ppt_第2页
第2页 / 共23页
《Java高级编程》PPT课件.ppt_第3页
第3页 / 共23页
点击查看更多>>
资源描述
第22讲Java高级编程 一 教学目标 理解多线程程序设计的基本思想掌握多线程的实现和线程的同步与控制理解Java网络编程的基本思想掌握基于Socket的低层Java网络编程与基于UDP的Java网络编程 以及基于无连接的数据报通信编程理解JDBC的基本思想掌握数据源的建立和数据库的访问 多线程程序设计 支持多线程 Java可以让不同的程序块同时运行 可以达到处理多任务的目的 所谓的线程 thread 是指程序的运行流程 多线程的技术使单个程序内部也可以在同一时刻执行多个代码段 完成不同的任务 这种机制称为多线程 Java语言利用多线程实现了一个异步的执行环境 例如 在一个网络应用程序里 可以在后台运行一个下载网络数据的线程 在前台则运行一个线程来显示当前下载的进度 以及一个用于处理用户输入数据的线程 Java多线程机制是通过Java类包java lang中的类Thread实现的 Thread类封装了对线程控制所必需的方法 classSTextendsThread publicST Stringstr super str publicvoidrun StringB 起床 早饭 上班 下班 StringS 备课 上课 布置作业 下课 StringName null Name getName for inti 0 i 4 i if Name equals B System out println Name B i try sleep long Math random 1000 catch InterruptedExceptione if Name equals S System out println Name S i try sleep long Math random 1000 catch InterruptedExceptione 单线程实现示例 单线程实现示例 续 publicclassEx12 1 publicstaticvoidmain Stringargs STs1 newST B STs2 newST S s1 run s2 run 运行结果 B 早饭B 上班B 下班S 备课S 上课S 布置作业S 下课 程序分析 try块中sleep 方法只是简单地告诉线程休息多少毫秒 其参数为休息时间 当这个时间过去后 线程即可继续执行 当某个线程睡眠时 sleep 并不占用系统资源 其他某一线程可继续工作 多线程的实现 单线程的限制 要运行s2 run 方法 一定要等到s1 run 运行完毕才行 激活多个线程 同时运行s1 run s2 run 方法使得上述结果交叉输出 实现多线程的方法 在类里激活线程此类必须是扩展自Thread类 extendsThread线程的处理必须编写在run 方法内 run 方法是定义在Thread类中的一个方法 使用接口实现多线程 多线程实现示例 classSTextendsThread publicST Stringstr super str publicvoidrun StringB 起床 早饭 上班 下班 StringS 备课 上课 布置作业 下课 StringName null Name getName for inti 0 i 4 i if Name equals B System out println Name B i try sleep long Math random 1000 catch InterruptedExceptione if Name equals S System out println Name S i try sleep long Math random 1000 catch InterruptedExceptione 多线程实现示例 续 publicclassEx12 2 publicstaticvoidmain Stringargs newST B start newST S start 运行结果 第一次运行第二次运行第三次运行B 起床B 起床B 起床S 备课S 备课S 备课S 上课B 早饭S 上课S 布置作业S 上课B 早饭B 早饭B 上班B 上班S 下课S 布置作业B 下班B 上班B 下班S 布置作业S 下班S 下课S 下课 程序分析 程序中的main 方法中构造了两个ST类的线程 一个称为 B 线程 另一个称为 S 线程 并调用了start 方法来启动这两个线程 这两个线程同时运行 并且同时显示输出 且这两个线程的输出次序是随机的 使用接口实现多线程 如果类本身已经继承了某个父类 现在又要继承Thread类来创建线程 就违背了Java不支持多继承的原则 解决这个问题的方法是使用接口 实现接口Runnable Runnable接口里声明了抽象的run 方法 把处理线程的程序代码放在run 里就可以创建线程了 创建一个程序实现当前时间显示 要求每2秒显示1次 显示20次后程序退出 分析 在Java的java util包中有一个Date类 可以通过实例化一个Date对象得到当前时间 要求每两秒显示一次时间 线程是完成这个任务最好的角色 通过每两秒唤醒线程一次 并且就在这一瞬间显示出时间 还需设置一个循环控制输出次数 使用接口实现多线程示例 importjava util Date publicclassEx12 3implementsRunnable privateThreadclock null privateDatenowtime newDate publicEx12 3 clock newThread this clock start publicvoidrun while true nowtime newDate System out println nowtime try clock sleep 2000 catch InterruptedExceptionie System err println Threaderror ie publicstaticvoidmain Stringargs Ex12 3time newEx12 3 使用接口实现多线程示例 续 运行结果 SatFeb1010 51 37CST2007SatFeb1010 51 39CST2007SatFeb1010 51 41CST2007SatFeb1010 51 43CST2007SatFeb1010 51 45CST2007SatFeb1010 51 47CST2007SatFeb1010 51 49CST2007SatFeb1010 51 51CST2007SatFeb1010 51 53CST2007SatFeb1010 51 55CST2007SatFeb1010 51 57CST2007SatFeb1010 51 59CST2007SatFeb1010 52 01CST2007SatFeb1010 52 03CST2007SatFeb1010 52 05CST2007SatFeb1010 52 07CST2007SatFeb1010 52 09CST2007SatFeb1010 52 11CST2007SatFeb1010 52 13CST2007SatFeb1010 52 15CST2007 程序分析 通过Thread类的构造方法创建clock线程并进行初始化 同时将Ex12 3类的当前对象 this 作为参数 该参数将clock线程的run 方法与Ex12 3类实现runnable接口的run 方法联系在一起 因此 当线程启动后 Java类的run 方法就开始执行 多线程同步示例 classCountmoney privatestaticintsum 0 publicstaticvoidadd intn intt sum t t n try Thread sleep int 1000 Math random catch InterruptedExceptione sum t System out println sum sum classCpersonextendsThread publicvoidrun for inti 1 i 3 i Countmoney add 100 publicclassEx12 4 publicstaticvoidmain Stringargs Cpersonc1 newCperson Cpersonc2 newCperson c1 start c2 start 运行结果 sum 100sum 200sum 300sum 100sum 200sum 300 多线程同步示例 程序分析 输出结果不正确 其错误原因在于两个线程在各自run 方法还没结束前 另一个线程已开始激活 因此造成计算上的错误 要更正这个错误 只要设置c1线程处理完之后 接着处理c2线程就可以了 在aad 方法之前加上synchronized关键字 使其成为同步方法 publicsynchronizedstaticvoidadd intn classCpersonextendsThread publicvoidrun for inti 1 i 3 i Countmoney add 100 为了避免资源冲突 Java使用关键字synchronized使方法通信同步 在同一时间内 一个方法只能有一个线程运行 在本例中 可以学到同步处理的重要性 如有多个线程共享一个变量时 特别要注意它们之间的访问顺序 否则一个线程未处理完某个方法时 另一个线程又进来 就有可能发生错误 实现多线程同步 synchronized 线程的四种状态 每一个线程 一般有四种状态 创建 运行 阻塞与消亡 这四种状态均可通过Thread类所提供的方法来控制 线程状态的转移与方法之间的关系如图12 1所示 线程在产生时便进入创建状态 即newThread 创建对象时 线程所处的便是这个状态 但此时系统并不会分配资源 直到用start 方法激活线程时才会分配 当start 方法激活线程时 线程进入可运行的状态 此时最先抢到CPU资源的线程先开始运行start 方法 其余的线程在队列中等待机会争取CPU的资源 一旦争取到就开始运行 线程状态转换图 图12 1线程状态的转移与方法之间的关系 线程的四种状态的转换过程 当发生下列事件之一时 线程就进入阻塞状态 1 该线程调用对象的wait 方法 2 该线程本身调用sleep 方法 sleep longmillis 可用来设置睡眠的时间 3 该线程和另一个线程join 在一起时 当某一线程调用join 时 则其他尚未激活的线程或程序代码会等到该线程结束后才会开始运行 当线程被阻塞后 便停止run 方法的运行 直到被阻塞的原因不存在后 线程回到可运行状态 继续排队争取CPU的资源 线程的状态转换 线程被阻塞情形消失的原因有下列几点 1 如果线程是由调用对象的wait 方法所阻塞 则该对象的notify 方法被调用时可解除阻塞 notify 方法用来 通知 被wait 阻塞的线程开始运行 2 线程进入睡眠状态 但指定的睡眠时间到了 当线程的run 方法结束 或是线程调用它的stop 时 则线程进入消亡的状态 利用上述方法可以完成线程间的通信以及线程状态之间的转换 下面举例说明通过wait notify 来达到线程间的通信和状态的转换 线程间通信示例 例12 5线程间通信的示例 本例模拟两个银行之间的转帐业务 当A银行转帐给B银行后 暂停转帐 通知B银行转帐给A银行 转帐金额随机确定 源代码如下 importjava awt importjava awt event publicclassEx12 5extendsFrame protectedstaticfinalString NAMES A B privateintaccounts 1000 1000 privateTextAreainfo newTextArea 5 40 privateTextAreastatus newTextArea 5 40 publicEx12 5 super Ex12 5 setLayout newGridLayout 2 1 add makePanel info Accounts add makePanel status Threads validate pack setVisible true Ex12 5ThreadA newEx12 5Thread 0 this status Ex12 5ThreadB newEx12 5Thread 1 this status addWindowListener newWindowAdapter publicvoidwindowClosing WindowEventwe System exit 0 线程间通信示例 续 publicsynchronizedvoidtransfer intfrom intinto intamount info append nAccountA accounts 0 info append tAccountB accounts 1 info append n amount from NAMES from to NAMES into while accounts from amount try wait catch InterruptedExceptionie System err println Error ie accounts from amount accounts into amount notify privatePanelmakePanel TextAreatext Stringtitle Panelp newPanel p setLayout newBorderLayout p add North newLabel title p add Center text returnp publicstaticvoidmain Stringargs Ex12 5bank newEx12 5 publicstaticvoidmain Stringargs Ex12 5bank newEx12 5 线程间通信示例 续 classEx12 5ThreadextendsThread privateEx12 5bank privateintid privateTextAreadisplay publicEx12 5Thread int id Ex12 5 bank TextArea display bank bank id id display display start publicvoidrun while true intamount int 900 Math random display append nThread Ex12 5 NAMES id sends amount into Ex12 5 NAMES 1 id try sleep 50 catch InterruptedExceptionie System err println Interrupted bank transfer id 1 id amount 线程间通信示例 续 图12 1运行结果 线程间通信示例 续 程序分析 程序中创建一个银行类Ex12 5 一个整型数组域accounts 给两个银行初始化银行账户金额 然后在其构造方法中创建两个银行客户线程A和B 这个程序中最重要的方法是transfer 它是同步方法 它需要三个参数 取钱的账号 存钱的账号 转帐的金额 在转帐之前检查相应账号是否有足够的资金 然后在转帐之后计算新的余额 这个方法被每个银行共享 因此必须设计为同步方法 在一个银行使用时 这个方法被加锁 不再使用时 自动解锁 其他银行可以使用这个方法 程序中使用了方法start sleep run notify 和wait 请分析它们在程序中的作用 并理解运行顺序 如果将上例中intamount int 900 Math random 中900换成1500后运行结果会怎样
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!