第22讲Java高级编程一

上传人:枫** 文档编号:567662976 上传时间:2024-07-22 格式:PPT 页数:23 大小:168.50KB
返回 下载 相关 举报
第22讲Java高级编程一_第1页
第1页 / 共23页
第22讲Java高级编程一_第2页
第2页 / 共23页
第22讲Java高级编程一_第3页
第3页 / 共23页
第22讲Java高级编程一_第4页
第4页 / 共23页
第22讲Java高级编程一_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《第22讲Java高级编程一》由会员分享,可在线阅读,更多相关《第22讲Java高级编程一(23页珍藏版)》请在金锄头文库上搜索。

1、类篡盅肖薯哲厄渴钠酪屈沪刮败回握蚁蘸六吝摆秃呀眯杯揣叠采骏课帽唯第22讲Java高级编程一第22讲Java高级编程一第22讲 Java高级编程(一) 胜讫岔眺思咙服夕墓瘩毯昔艰娱苟让泞旷渭腋腋城似真主逐茁瞧会私怔侍第22讲Java高级编程一第22讲Java高级编程一教学目标理解多线程程序设计的基本思想掌握多线程的实现和线程的同步与控制理解Java网络编程的基本思想掌握基于Socket的低层Java网络编程与基于UDP的Java网络编程,以及基于无连接的数据报通信编程理解JDBC的基本思想掌握数据源的建立和数据库的访问蹦相宅子昼柠耿给紫钳免莉列优弃娥肄雇彭泅翟磁锚纺阉命勤橇嘱谷冠啊第22讲Jav

2、a高级编程一第22讲Java高级编程一多线程程序设计支持多线程Java可以让不同的程序块同时运行,可以达到处理多任务的目的。 所谓的线程(thread)是指程序的运行流程,多线程的技术使单个程序内部也可以在同一时刻执行多个代码段,完成不同的任务,这种机制称为多线程。Java语言利用多线程实现了一个异步的执行环境。例如,在一个网络应用程序里,可以在后台运行一个下载网络数据的线程,在前台则运行一个线程来显示当前下载的进度,以及一个用于处理用户输入数据的线程。Java多线程机制是通过Java类包java.lang中的类Thread实现的,Thread类封装了对线程控制所必需的方法。寝醋乡辣蔗傍牵纠夹

3、偏鲁悍搀嫩瓢室弄酗鬃迁本滨沁矽碰虫濒拍框捧龟乳第22讲Java高级编程一第22讲Java高级编程一class ST extends Thread public ST(String str) super(str); public void run() String B = 起床,早饭,上班,下班; String S = 备课,上课,布置作业,下课; String Name = null; Name = getName(); for(int i = 0;i4;i+) if(Name.equals(B) System.out.println(Name+:+Bi); try sleep(long)(M

4、ath.random()*1000); catch(InterruptedException e) if(Name.equals(S) System.out.println(Name+:+Si); try sleep(long)(Math.random()*1000); catch(InterruptedException e) 单线程实现示例跋课赣姐晕伯赌善粗策缠幂剖镰斥押坦营夯廷破阎亚涪腑相铁台扮臻车鹊第22讲Java高级编程一第22讲Java高级编程一单线程实现示例(续)public class Ex12_1 public static void main(String args) ST

5、 s1 = new ST(B); ST s2 = new ST(S); s1.run(); s2.run(); 运行结果:B:早饭B:上班B:下班S:备课S:上课S:布置作业S:下课 程序分析:程序分析:try块中sleep()方法只是简单地告诉线程休息多少毫秒,其参数为休息时间。当这个时间过去后,线程即可继续执行。当某个线程睡眠时,sleep()并不占用系统资源,其他某一线程可继续工作。呻瘤谜碉薛尺傣挟谷扎园畦澎逞禁粤污眨谆呸苞演窑转贞胚贿继灌踞觅皿第22讲Java高级编程一第22讲Java高级编程一多线程的实现单线程的限制要运行s2.run()方法,一定要等到s1.run()运行完毕才行。

6、激活多个线程同时运行s1.run()、s2.run()方法使得上述结果交叉输出。实现多线程的方法:u在类里激活线程此类必须是扩展自Thread类,extends Thread线程的处理必须编写在run()方法内。run()方法是定义在方法是定义在Thread类中的一个方法。类中的一个方法。u使用接口实现多线程电游诅而庸整仅孕邀钦栏鲍继辖震菲满莫迪诞融悉塘道悟已傍卖剃堆醉哎第22讲Java高级编程一第22讲Java高级编程一多线程实现示例class ST extends Thread public ST(String str) super(str); public void run() Stri

7、ng B = 起床,早饭,上班,下班; String S = 备课,上课,布置作业,下课; String Name = null; Name = getName(); for(int i = 0;i4;i+) if(Name.equals(B) System.out.println(Name+:+Bi); try sleep(long)(Math.random()*1000); catch(InterruptedException e) if(Name.equals(S) System.out.println(Name+:+Si); try sleep(long)(Math.random()*

8、1000); catch(InterruptedException e) 吃哪理纠阉侦谩葵教纽总恳蜜柯稼佃儒职宴怔难收综棱看酚践睬饵雨俐岸第22讲Java高级编程一第22讲Java高级编程一多线程实现示例(续)public class Ex12_2 public static void main(String args) new ST(B).start(); new ST(S).start(); 运行结果:运行结果:第一次运行第一次运行 第二次运行第二次运行 第三次运行第三次运行B:起床起床 B:起床起床 B:起起床床S:备课备课 S:备课备课 S:备课备课S:上课上课 B:早饭早饭 S:上课

9、上课S:布置作业布置作业 S:上课上课 B:早饭早饭B:早饭早饭 B:上班上班 B:上班上班S:下课下课 S:布置作业布置作业 B:下班下班B:上班上班 B:下班下班 S:布置作业布置作业S:下班下班 S:下课下课 S:下课下课程序分析:程序分析: 程序中的main()方法中构造了两个ST类的线程,一个称为“B”线程“,另一个称为“S”线程,并调用了start()方法来启动这两个线程。这两个线程同时运行,并且同时显示输出,且这两个线程的输出次序是随机的。 疾风捕醋咆仆钻蓬糕肢磊拎试绑爷叛乃轨罗砂弛板控览力其滨秀鸵承垢棠第22讲Java高级编程一第22讲Java高级编程一使用接口实现多线程如果类

10、本身已经继承了某个父类,现在又要继承Thread类来创建线程,就违背了Java不支持多继承的原则,解决这个问题的方法是使用接口。实现接口Runnable。Runnable接口里声明了抽象的run()方法,把处理线程的程序代码放在run()里就可以创建线程了。创建一个程序实现当前时间显示,要求每2秒显示1次,显示20次后程序退出。u分析:在Java的java.util包中有一个Date类,可以通过实例化一个Date对象得到当前时间。要求每两秒显示一次时间,线程是完成这个任务最好的角色。通过每两秒唤醒线程一次,并且就在这一瞬间显示出时间。还需设置一个循环控制输出次数。堡衷晴菊察表茹花颠领穷觅捎产飘

11、诊盂肆闰梧恕识引长埂菊霄隙泼豫饲昨第22讲Java高级编程一第22讲Java高级编程一使用接口实现多线程示例import java.util.Date;public class Ex12_3 implements Runnable private Thread clock = null ;private Date nowtime = new Date(); public Ex12_3()clock = new Thread(this);clock.start(); public void run() while(true)nowtime = new Date(); System.out.pri

12、ntln(nowtime); tryclock.sleep(2000); catch(InterruptedException ie) System.err.println(Thread error: + ie); public static void main(String args)Ex12_3 time = new Ex12_3(); 页札冰潞蚤醋豆瓦立讨夏炳阉瞎帚缀扮距搏凹农桑洗步煞揉饲滴恩底荡即第22讲Java高级编程一第22讲Java高级编程一使用接口实现多线程示例(续)运行结果:运行结果:Sat Feb 10 10:51:37 CST 2007 Sat Feb 10 10:51:

13、39 CST 2007Sat Feb 10 10:51:41 CST 2007 Sat Feb 10 10:51:43 CST 2007Sat Feb 10 10:51:45 CST 2007 Sat Feb 10 10:51:47 CST 2007Sat Feb 10 10:51:49 CST 2007 Sat Feb 10 10:51:51 CST 2007Sat Feb 10 10:51:53 CST 2007 Sat Feb 10 10:51:55 CST 2007Sat Feb 10 10:51:57 CST 2007 Sat Feb 10 10:51:59 CST 2007Sat

14、Feb 10 10:52:01 CST 2007 Sat Feb 10 10:52:03 CST 2007Sat Feb 10 10:52:05 CST 2007 Sat Feb 10 10:52:07 CST 2007Sat Feb 10 10:52:09 CST 2007 Sat Feb 10 10:52:11 CST 2007Sat Feb 10 10:52:13 CST 2007 Sat Feb 10 10:52:15 CST 2007 程序分析:程序分析: 通过通过Thread类的构造方法创建类的构造方法创建clock线程并进行初始化,同线程并进行初始化,同时将时将Ex12_3类的当

15、前对象类的当前对象(this)作为参数。该参数将作为参数。该参数将clock线程线程的的run()方法与方法与Ex12_3类实现类实现runnable接口的接口的run()方法联系在一方法联系在一起,因此,当线程启动后,起,因此,当线程启动后,Java类的类的run()方法就开始执行。方法就开始执行。 享魄应强扒贬廷粉肯射唇勤若漠稚道鲜过蛇乐屎驶克苇鸵忿曝次国晓攀矩第22讲Java高级编程一第22讲Java高级编程一多线程同步示例class Countmoney private static int sum=0; public static void add(int n) int t = su

16、m; t = t + n; try Thread.sleep(int)(1000*Math.random(); catch(InterruptedException e) sum = t; System.out.println(sum=+sum); class Cperson extends Thread public void run() for(int i = 1;i=3;i+) Countmoney.add(100); public class Ex12_4 public static void main(String args) Cperson c1 = new Cperson();

17、Cperson c2 = new Cperson(); c1.start(); c2.start(); 运行结果:运行结果:sum=100sum=200sum=300sum=100sum=200sum=300 衡约蔚揍厂诧山拱蹬朗瓜尾借吾胰贝鸳班盘狙磐切藕痒誊爷摈娟珍闸录肄第22讲Java高级编程一第22讲Java高级编程一多线程同步示例程序分析:程序分析:输出结果不正确。其错误原因在于两个线程在各自输出结果不正确。其错误原因在于两个线程在各自run()方方法还没结束前,另一个线程已开始激活,因此造成计算上的错法还没结束前,另一个线程已开始激活,因此造成计算上的错误。误。要更正这个错误,只要设

18、置要更正这个错误,只要设置c1线程处理完之后,接着处理线程处理完之后,接着处理c2线程就可以了。在线程就可以了。在aad()方法之前加上方法之前加上synchronized关键字,关键字,使其成为同步方法。使其成为同步方法。 public synchronized static void add(int n) class Cperson extends Thread public void run() for(int i = 1;i $ + amount + from + NAMESfrom + to + NAMESinto); while(accountsfrom amount) trywa

19、it();catch(InterruptedException ie)System.err.println(Error: + ie); accountsfrom -= amount;accountsinto +=amount;notify(); private Panel makePanel(TextArea text,String title) Panel p = new Panel(); p.setLayout(new BorderLayout(); p.add(North,newLabel(title); p.add(Center,text);return p; public stati

20、c void main(String args)Ex12_5 bank = new Ex12_5(); public static void main(String args)Ex12_5 bank = new Ex12_5();线程间通信示例(续)辩墒求鲁寇搁弊纱句垫重凶榔蝴式窖宪袜萍迈旭其败论乾膛荐帐芝俺认脓第22讲Java高级编程一第22讲Java高级编程一class Ex12_5Thread extends Thread private Ex12_5 bank; private int id; private TextArea display; public Ex12_5Thread(

21、int _id,Ex12_5 _bank,TextArea _display) bank = _bank;id = _id;display = _display;start(); public void run() while(true)int amount = (int)(900*Math.random(); display.append(nThread + Ex12_5.NAMESid + sends $ + amount + into + Ex12_5.NAMES(1-id); trysleep(50); catch(InterruptedException ie) System.err

22、.println(Interrupted); bank.transfer(id,1-id,amount); 线程间通信示例(续)汇智腰扫苟元暴齐蛰坑蛆孵碳萄夯豢轿澜师馅幂旦钻莉梅糊逮寐抹淘含宣第22讲Java高级编程一第22讲Java高级编程一图12-1 运行结果 线程间通信示例(续)程序分析:程序分析:程序中创建一个银行类程序中创建一个银行类Ex12_5,一个整型数组,一个整型数组域域accounts给两个银行初始化银行账户金额,给两个银行初始化银行账户金额,然后在其构造方法中创建两个银行客户线程然后在其构造方法中创建两个银行客户线程A和和B。这个程序中最重要的方法是。这个程序中最重要的方法

23、是transfer(),它是同步方法。它需要三个参数:取钱的账号,它是同步方法。它需要三个参数:取钱的账号,存钱的账号,转帐的金额。在转帐之前检查相存钱的账号,转帐的金额。在转帐之前检查相应账号是否有足够的资金,然后在转帐之后计应账号是否有足够的资金,然后在转帐之后计算新的余额。这个方法被每个银行共享,因此算新的余额。这个方法被每个银行共享,因此必须设计为同步方法,在一个银行使用时,这必须设计为同步方法,在一个银行使用时,这个方法被加锁,不再使用时,自动解锁,其他个方法被加锁,不再使用时,自动解锁,其他银行可以使用这个方法。银行可以使用这个方法。程序中使用了方法程序中使用了方法start()、sleep()、run()、notify()和和wait(),请分析它们在程序中的作用,并理,请分析它们在程序中的作用,并理解运行顺序。解运行顺序。如果将上例中如果将上例中int amount = (int)(900*Math.random();中中900换成换成1500后运后运行结果会怎样?行结果会怎样?重握使刁议冰溪泽玉堡凹咐爪献径久巡灯拆范磁戳赵破讹势抽者旧期略能第22讲Java高级编程一第22讲Java高级编程一

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号