湖南工业大学《JAVA面向对象的程序设计》课件-第十一章_第1页
湖南工业大学《JAVA面向对象的程序设计》课件-第十一章_第2页
湖南工业大学《JAVA面向对象的程序设计》课件-第十一章_第3页
湖南工业大学《JAVA面向对象的程序设计》课件-第十一章_第4页
湖南工业大学《JAVA面向对象的程序设计》课件-第十一章_第5页
已阅读5页,还剩40页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2010-1-101《Java面向对象程序设计》第11讲Java多线程机制2010-1-102主要内容Java中的线程Thread子类创建线程使用Runnable接口线程的常用方法GUI线程线程同步在同步方法中使用wait()、notify和notifyAll()方法计时器线程线程联合守护线程难点线程同步导读2010-1-103多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况,它使得编程人员可以很方便地开发出具有多线程功能、能同时处理多个任务的功能强大的应用程序。Java虚拟机(JVM)负责管理这些线程,这些线程将被轮流执行,使得每个线程都有机会使用CPU资源。

概述2010-1-104§15.1Java中的线程

§15.1.1程序、进程与线程

程序是一段静态的代码,它是应用软件执行的蓝本。

进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。

线程是比进程更小的执行单位。2010-1-105§15.1.2线程的状态与生命周期建的线程在它的一个完整的生命周期中通常要经历如下的四种状态:1.新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。2.运行:线程必须调用start()方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新一个线程排队等候切换了。一旦轮到它来享用CPU资源时,此线程的就可以脱离创建它的主线程独立开始自己的生命周期了。3.中断:有4种原因的中断:

◆JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态。

◆线程使用CPU资源期间,执行了sleep(intmillsecond)方法,使当前线程进入休眠状。

◆线程使用CPU资源期间,执行了wait()方法。

◆线程使用CPU资源期间,执行某个操作进入阻塞状态。4.死亡:处于死亡状态的线程不具有继续运行的能力。线程释放了实体。例题15-12010-1-106publicclassExample15_1{publicstaticvoidmain(Stringargs[]){//主线程

SpeakHellospeakHello;SpeakNihaospeakNihao;speakHello=newSpeakHello();//创建线程

speakNihao=newSpeakNihao();//创建线程

speakHello.start();//启动线程

speakNihao.start();//启动线程

for(inti=1;i<=15;i++){System.out.print("大家好"+i+"");}}}2010-1-107publicclassSpeakHelloextendsThread{publicvoidrun(){for(inti=1;i<=20;i++){System.out.print("hello"+i+"");}}}2010-1-108publicclassSpeakNihaoextendsThread{publicvoidrun(){for(inti=1;i<=20;i++){System.out.print("您好"+i+"");}}}2010-1-109§15.1.3线程调度与优先级处于就绪状态的线程首先进入就绪队列排队等候CPU资源,同一时刻在就绪队列中的线程可能有多个。Java虚拟机(JVM)中的线程调度器负责管理线程,调度器把线程的优先级分为10个级别,分别用Thread类中的类常量表示。

Java调度器的任务是使高优先级的线程能始终运行,一旦时间片有空闲,则使具有同等优先级的线程以轮流的方式顺序使用时间片。

2010-1-1010§15.2Thread的子类创建线程

在编写Thread类的子类时,需要重写父类的run()方法,其目的是规定线程的具体操作,否则线程就什么也不做,因为父类的run()方法中没有任何操作语句。例题15-22010-1-1011§15.3使用Runnable接口

§15.3.1

Runnable接口与目标对象创建线程的另一个途径就是用Thread类直接创建线程对象。使用Thread创建线程对象时,通常使用的构造方法是:

Thread(Runnabletarget);该构造方法中的参数是一个Runnable类型的接口。在创建线程对象时必须向构造方法的参数传递一个实现Runnable接口类的实例,该实例对象称作所创线程的目标对象,当线程调用start()方法后,一旦轮到它来享用CPU资源,目标对象就会自动调用接口中的run()方法(接口回调)。例题15-32010-1-1012§15.3.2关于run方法中的局部变量对于具有相同目标对象的线程,当其中一个线程享用CPU资源时,目标对象自动调用接口中的run方法,这时,run方法中的局部变量被分配内存空间,当轮到另一个线程享用CPU资源时,目标对象会再次调用接口中的run方法,那么,run()方法中的局部变量会再次分配内存空间。

例题15-42010-1-1013§15.3.3在线程中启动其它线程线程通过调用start()方法将启动该线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的主线程独立开始自己的生命周期了。可以在任何一个线程中启动另外一个线程。例题15-52010-1-1014§15.4线程的常用方法

1.start():

线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。2.run():Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。

3.sleep(intmillsecond):

优先级高的线程可以在它的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间。

4.isAlive():线程处于“新建”状态时,线程调用isAlive()方法返回false。在线程的run()方法结束之前,即没有进入死亡状态之前,线程调用isAlive()方法返回true。

例题15-65.currentThread():该方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。

6.interrupt():一个占有CPU资源的线程可以让休眠的线程调用interrupt()方法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源。例题15-72010-1-1015§15.5GUI线程

当Java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue和AWT-Windows。AWT-EventQuecue线程负责处理GUI事件,AWT-Windows线程负责将窗体或组件绘制到桌面。

例题15-8,例题15-92010-1-1016§15.6线程同步在处理多线程问题时,我们必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一个线程需要修改这个变量。我们应对这样的问题作出处理。在处理线程同步时,要做的第一件事就是要把修改数据的方法用关键字synchronized来修饰。

所谓线程同步就是若干个线程都需要使用一个synchronized修饰的方法。例题15-102010-1-1017§15.7在同步方法中使用wait()、notify和otifyAll()方法

wait()方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。

notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。曾中断的线程就会从刚才的中断处继续执行这个同步方法,并遵循“先中断先继续”的原则。

notify()方法只是通知处于等待中的线程的某一个结束等待。

例题15-11,例题15-122010-1-1018§15.8计时器线程Timer当某些操作需要周期性地执行,就可以使用计时器。

Timer类的构造方法:Timer(inta,Objectb);

计时器发生的震铃事件是ActinEvent类型事件。相关方法:

start()启动计时器,即启动线程。

stop()停止计时器,即挂起线程。

restart()重新启动计时器,即恢复线程。例题15-13

2010-1-1019§15.9线程联合一个线程A在占有CPU资源期间,可以让其它线程调用join()和本线程联合,如:

B.join();我们称A在运行期间联合了B。

例题15-142010-1-1020§15.10守护线程线程默认是非守护线程,非守护线程也称作用户(user)线程。一个线程调用voidsetDaemon(booleanon)方法可以将自己设置成一个守护(Daemon)线程,例如:

thread.setDaemon(true);

例题15-152010-1-1021§15.11小结

1.线程是比进程更小的执行单位。一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。2.Java虚拟机(JVM)中的线程调度器负责管理线程,在采用时间片的系统中,每个线程都有机会获得CUP的使用权。当线程使用CUP资源的时间到时后,即使线程没有完成自己的全部操作,Java调度器也会中断当前线程的执行,把CUP的使用权切换给下一个排队等待的线程,当前线程将等待CUP资源的下一次轮回,然后从中断处继续执行。3.线程创建后仅仅是占有了内存资源,在JVM管理的线程中还没有这个线程,此线程必须调用start()方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新一个线程排队等候切换了。4.线程同步是指几个线程都需要调用同一个同步方法(用synchronized修饰的方法)。一个线程在使用的同步方法中时,可能根据问题的需要,必须使用wait()方法暂时让出CPU的使用权,以便其它线程使用这个同步方法。其它线程如果在使用这个同步方法时如果不需要等待,那么它用完这个同步方法的同时,应当执行notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。2010-1-1022《Java面向对象程序设计》第16章Java网络基础

2010-1-1023主要内容URL类InetAdress类套接字UDP数据报广播数据报Java远程调用(RMI)难点套接字Java远程调用(RMI)导读本章重点介绍URL、Socket、InetAddress和DatagramSocket类在网络编程中的重要作用,以及远程调用的基础知识。2010-1-1024§16.1URL类

包中的URL类是对统一资源定位符(UniformResourceLocator)的抽象,使用URL创建对象的应用程序称作客户端程序。

一个URL对象通常包含最基本的三部分信息:协议、地址、资源。

2010-1-1025§16.1.1URL的构造方法

URL类通常使用如下的构造方法创建一个URL对象:publicURL(Stringspec)throwsMalformedURLException

publicURL(Stringprotocol,Stringhost,Stringfile)throwsMalformedURLException2010-1-1026§16.1.2读取URL中的资源

URL对象调用

InputStreamopenStream()

方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源读入到客户端。

例题16-12010-1-1027publicclassExample16_1{publicstaticvoidmain(Stringargs[]){WindowURLwin=newWindowURL();win.setTitle("读取URL中的资源");}}2010-1-1028importjava.awt.*;importjava.awt.event.*;import.*;importjava.io.*;importjavax.swing.*;publicclassWindowURLextendsJFrameimplementsActionListener,Runnable{JButtonbutton;URLurl;JTextFieldtext;JEditorPaneeditPane;byteb[]=newbyte[118];Threadthread;publicWindowURL(){text=newJTextField(20);editPane=newJEditorPane();editPane.setEditable(false);button=newJButton("确定");button.addActionListener(this);thread=newThread(this);JPanelp=newJPanel();p.add(newJLabel("输入网址:"));p.add(text);p.add(button);JScrollPanescroll=newJScrollPane(editPane);add(scroll,BorderLayout.CENTER);add(p,BorderLayout.NORTH);setBounds(160,60,420,300);setVisible(true);validate();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicvoidactionPerformed(ActionEvente){if(!(thread.isAlive()))thread=newThread(this);try{thread.start();}catch(Exceptionee){text.setText("我正在读取"+url);}}publicvoidrun(){try{intn=-1;editPane.setText(null);url=newURL(text.getText().trim());editPane.setPage(url);}catch(Exceptione1){text.setText(""+e1);return;}}}2010-1-1029§16.1.3显示URL资源中的html文件

◆Javax.swing包中的JEditorPane容器可以解释执行html文件,这样用户就能看到了网页的运行效果。

◆可以使用JEditorPane类的下列构造方法:publicJEditorPane()publicJEditorPane(URLinitialPage)throwsIOExceptionpublicJEditorPane(Stringurl)throwsIOException构造JEditorPane对象。

◆JEditorPane对象调用publicvoidsetPage(URLpage)throwsIOException方法可以显示新的URL中的资源。例题16-2

2010-1-1030§16.1.4处理超链接

◆前提:当JEditorPane对象调用setEditable方法将编辑属性设为false时,用户单击网页中超链接可以使得JEditorPane对象触发HyperlinkEvent事件。

◆程序可以通过处理HyperlinkEvent事件,来显示新的URL资源。

★JEditorPane对象调用

addHyperlinkListener(HyperlinkListenerlistener)

获得监视器。★监视器需实现HyperlinkListener接口该接口中的方法是:voidhyperlinkUpdate(HyperlinkEvente)

例题16-3

2010-1-1031§16.2InetAdress类

§16.2.1地址的表示

Internet上的主机有两种方式表示地址:1.域名例如2.IP地址例如10

包中的InetAddress类对象含有一个Internet主机地址的域名和IP地址,例如

/10

。

2010-1-1032§16.2.2获取地址1.获取Internet上主机的地址可以使用InetAddress类的静态方法getByName(Strings);获得一个InetAddress对象,该对象含有主机地址的域名和IP地址,该对象用如下格式表示它包含的信息:/0

2.获取本地机的地址我们可以使用InetAddress类的静态方法getLocalHost()获得一个InetAddress对象,该对象含有本地机的域名和IP地址。

例题16-42010-1-1033§16.3套接字

§16.3.1套接字Socket

IP地址标识Internet上的计算机,端口号标识正在计算机上运行的进程(程序)。端口号被规定为一个16位的0~65535之间的整数。当两个程序需要通信时,它们可以通过使用Socket类建立套接字对象并连接在一起(端口号与IP地址的组合得出一个网络套接字)。

包中的InetAddress类对象含有一个Internet主机地址的域名和IP地址,例如

/10

。

2010-1-1034§16.3.2客户端的套接字对象

◆

客户端的程序使用Socket类建立负责连接到服务器的套接字对象。建立连接到服务器的套接字对象:try{Socketmysocket=newSocket(“8”,1880);}catch(IOExceptione){}◆与mysocket相关方法getInputStream()获得一个输入流

getOutputStream()获得一个输出流

用getInputStream()得到的输入流接到另一个DataInputStream数据流上

用getOutputStream()得到的输出流接到另一个DataOutputStream数据流上

2010-1-1035§16.3.3ServerSocket类

◆服务器必须建立一个ServerSocket对象,该对象通过将客户端的套接字对象和服务器端的一个套接字对象连接起来,从而达到连接的目的。◆建立ServerSocket对象:try{ServerSocketserver_socket=newServerSocket(1880);}catch(IOExceptione){}

◆使用方法accept()将客户的套接字和服务器端的套接字连接起来,代码如下所示:try{Socketsc=server_socket.accept();}catch(IOExceptione){}

◆所谓“接收”客户的套接字连接就是accept()方法会返回一个和客户端Socket对象相连接的Socket对象。例题16-52010-1-1036§16.3.3ServerSocket类_续

2010-1-1037§16.3.4把套接字连接放在一个线程中

◆为了防止堵塞线程,服务器端收到一个客户的套接字后,就应该启动一个专门为该客户服务的线程。

◆在下面的例子中,客户使用Socket类不带参数的构造方法Socket()创建一个套接字对象,该对象需调用

publicvoidconnect(SocketAddressendpoint)throwsIOException请求和参数SocketAddress指定地址的套接字建立连接。

◆为了使用connect方法,可以使用SocketAddress的子类InetSocketAddress创建一个对象,InetSocketAddress的构造方法是:publicInetSocketAddress(InetAddressaddr,intport)

例题16-62010-1-1038§16.4UDP数

据

报

基于UDP的通信和基于TCP的通信不同,基于UDP的信息传递更快,但不提供可靠性保证。

基于UDP通信的基本模式是:1.将数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地。

2.接受别人发来的数据包(好比接收信封一样),然后查看数据包中的内容。2010-1-1039§16.4.1发送数据包

1.用DatagramPacket类将数据打包,即用DatagramPacket类创建一个对象,称为数据包。用DatagramPacket的以下两个构造方法创建待发送的数据包:

DatagramPacket(bytedata[],intlength,InetAddtressaddress,intport)DatagramPack(bytedata[],intoffset,intlength,InetAddtressaddress,intport)

2.用DatagramSocket类的不带参数的构造方法:DatagramSocket()创建一个对象,该对象负责发送数据包。例如:DatagramSocketmail_out=newDatagramSocket();mail_out.send(data_pack);2010-1-1040§16.4.2接收数据包

1.

首先用DatagramSocket的另一个构造方法DatagramSocket(intport)

创建一个对象,其中的参数必须和待接收的数据包的端口号相同。例如,如果发送方发送的数据包的端口是5666,那么如下创建DatagramSocket对象:DatagramSocketmail_in=newDatagramSocket(5666);

2.

然后对象mail_in使用方法receive(DatagramPacketpack)接受数据包。3.用DatagramPack类的另外一个构造方法:DatagramPack(bytedata[],intlength)创建一个数据包,用于接收数据包,例如:bytedata[]=newbyte[100];intlength=90;DatagramPacketpack=newDatagramPacket(data,length);mail_in.receive(pack);例题16-7该数据包pack将接收长度是length字节的数据放入data。2010-1-1041§16.5广播数据报广播数据报涉及到地址和端口。广播数据报是一种较新的技术,要广播或接收广播的主机都必须加入到同一个D类地址。例题16-82010-1-1042§16.6Java远程调用(RMI)

Java远程调用,RMI(RemoteMethodInvocation)是一种分布式技术,使用RMI可以让一个虚拟机(JVM)上的应用程序请求调用位于网络上另一处的JVM上的对象方法。习惯上称发出调用请求的虚拟机(JVM)为(本地)客户机,称接受并执行请求的虚拟机(JVM)为(远程)服务器。

2010-1-1043§16.6.1远程对象及其代理1.远程对象:驻留在(远程)服务器上的对象是客户要请求的对象,称作远程对象。

2.代理与存根(Stub):代理的特点是它与远程对象实现了相同的接口。存根(Stub):一种特殊的字节码,并让这个存根产生的对象为作为远程对象的代理。

3.Remote接口RMI为了标识一个对象是远程对象,即可以被客户请求的对象,要求远程对象必须实

温馨提示

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

最新文档

评论

0/150

提交评论