第22讲 Java高级编程(一)

上传人:小**** 文档编号:243138644 上传时间:2024-09-16 格式:PPT 页数:23 大小:208.50KB
返回 下载 相关 举报
第22讲 Java高级编程(一)_第1页
第1页 / 共23页
第22讲 Java高级编程(一)_第2页
第2页 / 共23页
第22讲 Java高级编程(一)_第3页
第3页 / 共23页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,22,讲,Java,高级编程(一),教学目标,理解多线程程序设计的基本思想,掌握多线程的实现和线程的同步与控制,理解,Java,网络编程的基本思想,掌握基于,Socket,的低层,Java,网络编程与基于,UDP,的,Java,网络编程,以及基于无连接的数据报通信编程,理解,JDBC,的基本思想,掌握数据源的建立和数据库的访问,多线程程序设计,支持多线程,Java,可以让不同的程序块同时运行,可以达到处理多任务的目的。,所谓的线程,(thread),是指程序的运行流程,多线程的技术使单个程序内部也可以在同一时刻执行多个代码段,完成不同的任务,这种机制称为多线程。,Java,语言利用多线程实现了一个异步的执行环境。例如,在一个网络应用程序里,可以在后台运行一个下载网络数据的线程,在前台则运行一个线程来显示当前下载的进度,以及一个用于处理用户输入数据的线程。,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 = 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 main(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(),方法使得上述结果交叉输出。,实现多线程的方法:,在类里激活线程,此类必须是扩展自,Thread,类,,extends Thread,线程的处理必须编写在,run(),方法内。,run(),方法是定义在,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 = 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(String,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,类的线程,一个称,为“,B”,线程,“,,另一个称为“,S”,线,程,并调用了,start(),方法来启,动这两个线程。这两个线程同时运行,并且同时显示输出,且这两个线程的输出次序是随机的。,使用接口实现多线程,如果类本身已经继承了某个父类,现在又要继承,Thread,类来创建线程,就违背了,Java,不支持多继承的原则,解决这个问题的方法是使用接口。,实现接口,Runnable,。,Runnable,接口里声明了抽象的,run(),方法,把处理线程的程序代码放在,run(),里就可以创建线程了。,创建一个程序实现当前时间显示,要求每,2,秒显示,1,次,显示,20,次后程序退出。,分析,:在,Java,的,java.util,包中有一个,Date,类,可以通过实例化一个,Date,对象得到当前时间。要求每两秒显示一次时间,线程是完成这个任务最好的角色。通过每两秒唤醒线程一次,并且就在这一瞬间显示出时间。还需设置一个循环控制输出次数。,使用接口实现多线程示例,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.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 2007,Sat Feb 10 10:51:41 CST 2007 Sat Feb 10 10:51:43 CST 2007,Sat Feb 10 10:51:45 CST 2007 Sat Feb 10 10:51:47 CST 2007,Sat Feb 10 10:51:49 CST 2007 Sat Feb 10 10:51:51 CST 2007,Sat Feb 10 10:51:53 CST 2007 Sat Feb 10 10:51:55 CST 2007,Sat Feb 10 10:51:57 CST 2007 Sat Feb 10 10:51:59 CST 2007,Sat Feb 10 10:52:01 CST 2007 Sat Feb 10 10:52:03 CST 2007,Sat Feb 10 10:52:05 CST 2007 Sat Feb 10 10:52:07 CST 2007,Sat Feb 10 10:52:09 CST 2007 Sat Feb 10 10:52:11 CST 2007,Sat Feb 10 10:52:13 CST 2007 Sat Feb 10 10:52:15 CST 2007,程序分析:,通过,Thread,类的构造方法创建,clock,线程并进行初始化,同时将,Ex12_3,类的当前对象,(this),作为参数。该参数将,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(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,();,Cperson,c2 = new,Cperson,();,c1.start();,c2.start();, ,运行结果:,sum=100,sum=200,sum=300,sum=100,sum=200,sum=300,多线程同步示例,程序分析,:,输出结果不正确。其错误原因在于两个线程在各自,run(),方法还没结束前,另一个线程已开始激活,因此造成计算上的错误。,要更正这个错误,只要设置,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),trywait();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 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_5Thread 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.NAMESid + 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,给两个银行初始化银行账户金额,然后在其构造方法中创建两个银行客户线程,A,和,B,。这个程序中最重要的方法是,transfer(),,它是同步方法。它需要三个参数:取钱的账号,存钱的账号,转帐的金额。在转帐之前检查相应账号是否有足够的资金,然后在转帐之后计算新的余额。这个方法被每个银行共享,因此必须设计为同步方法,在一个银行使用时,这个方法被加锁,不再使用时,自动解锁,其他银行可以使用这个方法。,程序中使用了方法,start(),、,sleep(),、,run(),、,notify(),和,wait(),,请分析它们在程序中的作用,并理解运行顺序。,如果将上例中,int,amount = (int)(900*Math.random();,中,900,换成,1500,后运行结果会怎样?,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


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

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


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