《【教学课件】第22讲Java高级编程(一).ppt》由会员分享,可在线阅读,更多相关《【教学课件】第22讲Java高级编程(一).ppt(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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=0;i4;i+)if(Name.equals(B)S
3、ystem.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
4、=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()方法使得上述结果交叉输出。实现多线程的方法:u在类里激活线程此类必须是扩展自Thread类,extends Thre
5、ad线程的处理必须编写在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=0;i4;i+)if(Name.equals(B)System.out.println(Name+:+Bi);try sleep
6、(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();运行结果:运行结果:第一次运行第一次运行 第二次运行第二次运
7、行 第三次运行第三次运行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()方法来启动这两个线程。这两个线程同时运行,并且同时显示输出,且这两个线程的输出次序是随机的。使用
8、接口实现多线程如果类本身已经继承了某个父类,现在又要继承Thread类来创建线程,就违背了Java不支持多继承的原则,解决这个问题的方法是使用接口。实现接口Runnable。Runnable接口里声明了抽象的run()方法,把处理线程的程序代码放在run()里就可以创建线程了。创建一个程序实现当前时间显示,要求每2秒显示1次,显示20次后程序退出。u分析:在Java的java.util包中有一个Date类,可以通过实例化一个Date对象得到当前时间。要求每两秒显示一次时间,线程是完成这个任务最好的角色。通过每两秒唤醒线程一次,并且就在这一瞬间显示出时间。还需设置一个循环控制输出次数。使用接口实
9、现多线程示例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
10、 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 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
11、 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 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:0
12、9 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)作为参数。该参数将作为参数。该参数将clock线程线程的的run()方法与方法与Ex12_3类实现类实现runnable接口的接口的run()方法联系在一方法联系在一起,因此,当线程启动后,起,因此,当线程启动后,Java类的类
13、的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
14、(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=300sum=100sum=200sum=300 多线程同步示例程序分析程序分析:输出结果不正确。其错误原因在于两个线程在各自输出结果不正确。其错误原因在于两个线程在各自run()方方法还没结束前,另一个线程已开始激活,因此造成计算上的错法还没结束前,另一个线程已开始激活,因
15、此造成计算上的错误。误。要更正这个错误,只要设置要更正这个错误,只要设置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 amoun
16、t)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
17、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
18、;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 运行结果 线程间通信示例(续)程序分析:程序分析:程序中创
19、建一个银行类程序中创建一个银行类Ex12_5,一个整型数组,一个整型数组域域accounts给两个银行初始化银行账户金额,给两个银行初始化银行账户金额,然后在其构造方法中创建两个银行客户线程然后在其构造方法中创建两个银行客户线程A和和B。这个程序中最重要的方法是。这个程序中最重要的方法是transfer(),它是同步方法。它需要三个参数:取钱的账号,它是同步方法。它需要三个参数:取钱的账号,存钱的账号,转帐的金额。在转帐之前检查相存钱的账号,转帐的金额。在转帐之前检查相应账号是否有足够的资金,然后在转帐之后计应账号是否有足够的资金,然后在转帐之后计算新的余额。这个方法被每个银行共享,因此算新的余额。这个方法被每个银行共享,因此必须设计为同步方法,在一个银行使用时,这必须设计为同步方法,在一个银行使用时,这个方法被加锁,不再使用时,自动解锁,其他个方法被加锁,不再使用时,自动解锁,其他银行可以使用这个方法。银行可以使用这个方法。程序中使用了方法程序中使用了方法start()、sleep()、run()、notify()和和wait(),请分析它们在程序中的作用,并理,请分析它们在程序中的作用,并理解运行顺序。解运行顺序。如果将上例中如果将上例中int amount=(int)(900*Math.random();中中900换成换成1500后运后运行结果会怎样?行结果会怎样?