第22讲Java高级程一

上传人:仙*** 文档编号:67318394 上传时间:2022-03-30 格式:PPT 页数:23 大小:168.50KB
收藏 版权申诉 举报 下载
第22讲Java高级程一_第1页
第1页 / 共23页
第22讲Java高级程一_第2页
第2页 / 共23页
第22讲Java高级程一_第3页
第3页 / 共23页
资源描述:

《第22讲Java高级程一》由会员分享,可在线阅读,更多相关《第22讲Java高级程一(23页珍藏版)》请在装配图网上搜索。

1、第22讲 Java高级编程(一) 教学目标 理解多线程程序设计的基本思想 掌握多线程的实现和线程的同步与控制 理解Java网络编程的基本思想 掌握基于Socket的低层Java网络编程与基于UDP的Java网络编程,以及基于无连接的数据报通信编程 理解JDBC的基本思想 掌握数据源的建立和数据库的访问多线程程序设计 支持多线程Java可以让不同的程序块同时运行,可以达到处理多任务的目的。 所谓的线程(thread)是指程序的运行流程,多线程的技术使单个程序内部也可以在同一时刻执行多个代码段,完成不同的任务,这种机制称为多线程。 Java语言利用多线程实现了一个异步的执行环境。例如,在一个网络应

2、用程序里,可以在后台运行一个下载网络数据的线程,在前台则运行一个线程来显示当前下载的进度,以及一个用于处理用户输入数据的线程。 Java多线程机制是通过Java类包java.lang中的类Thread实现的,Thread类封装了对线程控制所必需的方法。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

3、= 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()*1000); catch(InterruptedException e) 单线程实现示例单线程实现示例(续)public class Ex12_1 public static void m

4、ain(String args) ST s1 = new ST(B); ST s2 = new ST(S); s1.run(); s2.run(); 运行结果:B:早饭B:上班B:下班S:备课S:上课S:布置作业S:下课 程序分析:程序分析:try块中sleep()方法只是简单地告诉线程休息多少毫秒,其参数为休息时间。当这个时间过去后,线程即可继续执行。当某个线程睡眠时,sleep()并不占用系统资源,其他某一线程可继续工作。多线程的实现 单线程的限制要运行s2.run()方法,一定要等到s1.run()运行完毕才行。 激活多个线程同时运行s1.run()、s2.run()方法使得上述结果交叉

5、输出。 实现多线程的方法:u在类里激活线程此类必须是扩展自Thread类,extends Thread线程的处理必须编写在run()方法内。 run()方法是定义在方法是定义在Thread类中的一个方法。类中的一个方法。u使用接口实现多线程多线程实现示例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

6、 = 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()*1000); catch(InterruptedException e) 多线程实现示例(续)public class Ex12_2 public static void main(St

7、ring args) new ST(B).start(); new ST(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类的线程,

8、一个称为“B”线程“,另一个称为“S”线程,并调用了start()方法来启动这两个线程。这两个线程同时运行,并且同时显示输出,且这两个线程的输出次序是随机的。 使用接口实现多线程 如果类本身已经继承了某个父类,现在又要继承Thread类来创建线程,就违背了Java不支持多继承的原则,解决这个问题的方法是使用接口。 实现接口Runnable。Runnable接口里声明了抽象的run()方法,把处理线程的程序代码放在run()里就可以创建线程了。 创建一个程序实现当前时间显示,要求每2秒显示1次,显示20次后程序退出。u分析:在Java的java.util包中有一个Date类,可以通过实例化一个D

9、ate对象得到当前时间。要求每两秒显示一次时间,线程是完成这个任务最好的角色。通过每两秒唤醒线程一次,并且就在这一瞬间显示出时间。还需设置一个循环控制输出次数。使用接口实现多线程示例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

10、)nowtime = new Date(); System.out.println(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(); 使用接口实现多线程示例(续)运行结果:运行结果:Sat Feb 10 10:51:37 CST 2007 Sat Feb 10 10:51:39 CST 2007Sat Feb 10

11、 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 Feb 10 10:52:01 CST 2

12、007 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类的当前对象类的当前对象(this)作为参数。该

13、参数将作为参数。该参数将clock线程的线程的run()方法与方法与Ex12_3类实现类实现runnable接口的接口的run()方法联系在一起,方法联系在一起,因此,当线程启动后,因此,当线程启动后,Java类的类的run()方法就开始执行。方法就开始执行。 多线程同步示例class Countmoney private static int sum=0; public static void add(int n) int t = sum; t = t + n; try Thread.sleep(int)(1000*Math.random(); catch(InterruptedExcept

14、ion 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(); Cperson c2 = new Cperson(); c1.start(); c2.start(); 运行结果:运行结果:sum=100sum=200sum

15、=300sum=100sum=200sum=300 多线程同步示例程序分析:程序分析:输出结果不正确。其错误原因在于两个线程在各自输出结果不正确。其错误原因在于两个线程在各自run()方法还没结束前,另一个线程已开始激活,因此造成计算上的方法还没结束前,另一个线程已开始激活,因此造成计算上的错误。错误。要更正这个错误,只要设置要更正这个错误,只要设置c1线程处理完之后,接着处理线程处理完之后,接着处理c2线程就可以了。在线程就可以了。在aad()方法之前加上方法之前加上synchronized关键字,关键字,使其成为同步方法。使其成为同步方法。 public synchronized stat

16、ic void add(int n) class Cperson extends Thread public void run() for(int i = 1;i $ + amount + from + NAMESfrom + to + NAMESinto); while(accountsfrom amount) trywait();catch(InterruptedException ie)System.err.println(Error: + ie); accountsfrom -= amount;accountsinto +=amount;notify(); private Panel

17、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 static void main(String args)Ex12_5 bank = new Ex12_5(); public static void main(String args)Ex12_5 bank = new Ex12_5();线程间通信示例(续)class Ex12_5

18、Thread extends Thread private Ex12_5 bank; private int id; private TextArea display; public Ex12_5Thread(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.NAMESi

19、d + sends $ + amount + into + Ex12_5.NAMES(1-id); trysleep(50); catch(InterruptedException ie) System.err.println(Interrupted); bank.transfer(id,1-id,amount); 线程间通信示例(续)图12-1 运行结果 线程间通信示例(续)程序分析:程序分析:程序中创建一个银行类程序中创建一个银行类Ex12_5,一个整型数组,一个整型数组域域accounts给两个银行初始化银行账户金额,给两个银行初始化银行账户金额,然后在其构造方法中创建两个银行客户线程然

20、后在其构造方法中创建两个银行客户线程A和和B。这个程序中最重要的方法是。这个程序中最重要的方法是transfer(),它是同步方法。它需要三个参数:取钱的账号,它是同步方法。它需要三个参数:取钱的账号,存钱的账号,转帐的金额。在转帐之前检查相存钱的账号,转帐的金额。在转帐之前检查相应账号是否有足够的资金,然后在转帐之后计应账号是否有足够的资金,然后在转帐之后计算新的余额。这个方法被每个银行共享,因此算新的余额。这个方法被每个银行共享,因此必须设计为同步方法,在一个银行使用时,这必须设计为同步方法,在一个银行使用时,这个方法被加锁,不再使用时,自动解锁,其他个方法被加锁,不再使用时,自动解锁,其他银行可以使用这个方法。银行可以使用这个方法。程序中使用了方法程序中使用了方法start()、sleep()、run()、notify()和和wait(),请分析它们在程序中的作用,请分析它们在程序中的作用,并理解运行顺序。并理解运行顺序。如果将上例中如果将上例中int amount = (int)(900*Math.random();中中900换成换成1500后运后运行结果会怎样?行结果会怎样?

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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