《Java程序设计案例教程-模块.ppt》由会员分享,可在线阅读,更多相关《Java程序设计案例教程-模块.ppt(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、模块五模块五 异常处理与多线程设计异常处理与多线程设计目标目标 JavaJava语言支持多线程,所谓线程,指的是程序内部的顺序控语言支持多线程,所谓线程,指的是程序内部的顺序控制流,线程本身并不是程序,自身不能运行,必须在程序中运行,制流,线程本身并不是程序,自身不能运行,必须在程序中运行,本模块将介绍线程的构造,以及线程的同步。本模块将介绍线程的构造,以及线程的同步。学习本模块涉及哪些重要内容?本模块导读本模块导读无无论论使使用用哪哪种种语语言言进进行行程程序序设设计计,出出错错处处理理是是非非常常重重要要的的一一个个方方面面。导导致致异异常常发发生生的的原原因因有有很很多多种种,比比如如数
2、数组组越越界界、除除数数为为零零、访访问问的的文文件件不不存存在在等等等等。JavaJava语语言言是是使使用用面面向向对对象象的的方方法法通通过过异异常常进进行行出出错错处处理理的的,本模块将介绍什么是异常及如何处理程序中出现的异常。本模块将介绍什么是异常及如何处理程序中出现的异常。JavaJava语语言言支支持持多多线线程程,所所谓谓线线程程,指指的的是是程程序序内内部部的的顺顺序序控控制制流流,线线程程本本身身并并不不是是程程序序,自自身身不不能能运运行行,必必须须在在程程序序中中运运行行,本本模模块块将将介介绍绍线线程的构造,以及线程的同步。程的构造,以及线程的同步。学习本模块涉及哪些
3、重要内容?本模块要点本模块要点理解异常的产生和处理机制理解异常的产生和处理机制掌握如何捕获异常、抛出异常掌握如何捕获异常、抛出异常掌握如何构造线程并控制线程的同步掌握如何构造线程并控制线程的同步任务一任务一异常的产生和处理机制异常的产生和处理机制知识点详解知识点详解异常的定义异常的定义异常就是在程序运行过程中出现的不正常事件,该事件会中断指异常就是在程序运行过程中出现的不正常事件,该事件会中断指令的正常执行。令的正常执行。异常是程序运行时遇到的任何错误情况或意外行为。下列情况都异常是程序运行时遇到的任何错误情况或意外行为。下列情况都可以产生异常:程序代码或所调用的代码(如共享库)中有错误,可以
4、产生异常:程序代码或所调用的代码(如共享库)中有错误,如除数为如除数为0;操作系统资源不可用,如试图对只读文件进行写操;操作系统资源不可用,如试图对只读文件进行写操作;公共语言运行库遇到意外情况(如无法验证代码)等。对于作;公共语言运行库遇到意外情况(如无法验证代码)等。对于这些情况,应用程序可以对某些错误结果恢复到出错前的状态,这些情况,应用程序可以对某些错误结果恢复到出错前的状态,而对于另一些错误,则不能恢复。而对于另一些错误,则不能恢复。在设计程序时,应考虑到可能出现的异常情况,避免由于异常导在设计程序时,应考虑到可能出现的异常情况,避免由于异常导致系统崩溃的发生。处理异常情况的能力越强
5、,则说明程序的健致系统崩溃的发生。处理异常情况的能力越强,则说明程序的健壮性越好。壮性越好。任务一任务一异常的产生和处理机制异常的产生和处理机制知识点详解知识点详解异常类的类层次异常类的类层次在在Java语言中异常是一些特殊的类,其层次关系如图所示。语言中异常是一些特殊的类,其层次关系如图所示。所有的异常类都继承于类所有的异常类都继承于类throwable。异常类整体分为两类,一。异常类整体分为两类,一类继承于类类继承于类Error,这类异常通常不由程序捕获和处理;另一类,这类异常通常不由程序捕获和处理;另一类继承于继承于Exception,在程序中大量处理的就是这类异常。在这类,在程序中大量
6、处理的就是这类异常。在这类异常中,还分运行时异常异常中,还分运行时异常(继承于继承于RuntimeException)和非运行和非运行时异常,通常程序中不处理运行时异常,而是把它交给时异常,通常程序中不处理运行时异常,而是把它交给Java运行运行时系统。时系统。除运行时异常的其他继承于除运行时异常的其他继承于Exception的子类是非运行时异常,的子类是非运行时异常,对于这类异常,如果程序不进行处理,可能会使程序运行得到意对于这类异常,如果程序不进行处理,可能会使程序运行得到意想不到的结果,因此想不到的结果,因此Java编译器要求程序必须处理编译器要求程序必须处理(包括捕获或包括捕获或声明抛
7、弃声明抛弃)这类异常。这类异常。任务一任务一异常的产生和处理机制异常的产生和处理机制知识点详解知识点详解图5-1 异常类的层次关系任务一任务一异常的产生和处理机制异常的产生和处理机制知识点详解知识点详解异常的处理机制异常的处理机制在在Java程序的执行过程中,倘若出现了异常事件,就会生成一个程序的执行过程中,倘若出现了异常事件,就会生成一个异常对象,该对象可能由异常对象,该对象可能由Java虚拟机生成,也可能由程序中正在虚拟机生成,也可能由程序中正在进行的方法生成,包含一些指明异常事件类型和异常发生时程序进行的方法生成,包含一些指明异常事件类型和异常发生时程序运行的状态信息。运行的状态信息。生
8、成的异常对象将传递给生成的异常对象将传递给Java运行时系统,通常称异常的产生和运行时系统,通常称异常的产生和提交过程为抛出异常,对应的保留字为提交过程为抛出异常,对应的保留字为throw。运行时系统得到异常对象后,就会寻找该异常的代码。系统首先运行时系统得到异常对象后,就会寻找该异常的代码。系统首先从生成异常对象的代码快开始寻找,接着对方法的栈进行逐层回从生成异常对象的代码快开始寻找,接着对方法的栈进行逐层回溯,一直到找到一个能够处理该异常的方法为止,随后,运行时溯,一直到找到一个能够处理该异常的方法为止,随后,运行时系统把当前异常对象交给寻找到的方法处理,这个过程通常称为系统把当前异常对象
9、交给寻找到的方法处理,这个过程通常称为异常的捕获,对应的关键字为异常的捕获,对应的关键字为catch。如果。如果Java运行时系统没有运行时系统没有找到可以处理该异常的方法,运行时系统就会终止运行,运行的找到可以处理该异常的方法,运行时系统就会终止运行,运行的Java程序就会随之退出运行。程序就会随之退出运行。任务一任务一异常的产生和处理机制异常的产生和处理机制知识点详解知识点详解例如:算术运算异常例如:算术运算异常(由除由除0错误导致错误导致)完整的程序代码如下:完整的程序代码如下:class Test public int devide(int x,int y)i nt result=x/
10、y;return result;class ExceptionTest1 public static void main(String args)new text().devide(3,0);【1】System.out.println(program is running here!);任务一任务一异常的产生和处理机制异常的产生和处理机制知识点详解知识点详解代码详解代码详解【1 1】/*/*调用类调用类TestTest对象的对象的devidedevide方法方法,并向形参并向形参x x、y y传递实参:传递实参:3 3、0 0,传递的参数除数为,传递的参数除数为0*/0*/例题中由于例题中由于
11、mainmain函数中函数中【1 1】语句向语句向“int result=x/y;int result=x/y;”语句传递语句传递的参数的参数y=0,y=0,即除数为即除数为0,0,导致程序运行时出现异常。屏幕上出现如下导致程序运行时出现异常。屏幕上出现如下信息:信息:Exception in thread Exception in thread“mainmain”java.lang.ArithmeticException:/by java.lang.ArithmeticException:/by zerozeroat Text.decide(ExceptionTest1.java:5)at
12、Text.decide(ExceptionTest1.java:5)at ExceptionText1.main(ExceptionTest1.java:14)at ExceptionText1.main(ExceptionTest1.java:14)其中,其中,“ArithmeticExceptionArithmeticException”类为算术运算异常类类为算术运算异常类,出现异常后,出现异常后,程序无法继续进行。程序无法继续进行。任务二任务二异常捕获异常捕获知识点详解知识点详解【案例案例】试题选择时异常的捕获试题选择时异常的捕获实现该案例的代码段如下:实现该案例的代码段如下:try t
13、ry if(in!=null&read!=null)if(in!=null&read!=null)in.close();in.close();read.close();read.close();f=new File(filename);f=new File(filename);in=new FileReader(f);in=new FileReader(f);read=new BufferedReader(in);read=new BufferedReader(in);任务二任务二异常捕获异常捕获知识点详解知识点详解 correctAnswer=(read.readLine().trim();
14、correctAnswer=(read.readLine().trim();String temp=(read.readLine().trim();String temp=(read.readLine().trim();StringTokenizer token=new StringTokenizer(temp,:);StringTokenizer token=new StringTokenizer(temp,:);int hour=Integer.parseInt(token.nextToken();int hour=Integer.parseInt(token.nextToken();in
15、t minute=Integer.parseInt(token.nextToken();int minute=Integer.parseInt(token.nextToken();int second=Integer.parseInt(token.nextToken();int second=Integer.parseInt(token.nextToken();time=1000*(second+minute*60+hour*60*60);time=1000*(second+minute*60+hour*60*60);catch(Exception e)catch(Exception e)【1
16、 1】testContent=testContent=没有选择试题没有选择试题;【2 2】任务二任务二异常捕获异常捕获知识点详解知识点详解代码详解代码详解程序中字符程序中字符“e e”指异常对象,可以用任意标识符表示,但通常习惯指异常对象,可以用任意标识符表示,但通常习惯用字母用字母“e e”表示。表示。给出处理给出处理trytry代码块中所生成的异常事件的方法,运行时屏幕会显示代码块中所生成的异常事件的方法,运行时屏幕会显示出发生了怎样的异常情况。出发生了怎样的异常情况。catchcatch中的这条语句可以省略,不影响程中的这条语句可以省略,不影响程序的继续运行,但不利于提醒用户及时发现程序
17、中出现了怎样的异常序的继续运行,但不利于提醒用户及时发现程序中出现了怎样的异常情况。情况。捕获异常捕获异常下面介绍如何捕获异常。即下面介绍如何捕获异常。即try代码块中抛出了一个异常,接着利代码块中抛出了一个异常,接着利用用catch语句输出一些与该异常相关的信息。语句输出一些与该异常相关的信息。捕获异常就是在某个方法中对某种类型的异常对象提供了相应的捕获异常就是在某个方法中对某种类型的异常对象提供了相应的处理方法,捕获异常是通过处理方法,捕获异常是通过try-catch-finally语句来实现的,该语语句来实现的,该语句的格式如下:句的格式如下:任务二任务二异常捕获异常捕获知识点详解知识点
18、详解 try catch(ExceptionType1 exceptionobject)catch(ExceptionType2 exceptionobject)finally 任务二任务二异常捕获异常捕获知识点详解知识点详解下面介绍下面介绍try-catch-finallytry-catch-finally语句各部分的用法。语句各部分的用法。TryTry try try代码块选定捕获异常的范围,代码块选定捕获异常的范围,trytry代码块所限定的语句在执代码块所限定的语句在执行过程中可能会生成异常对象并抛出异常对象。行过程中可能会生成异常对象并抛出异常对象。CatchCatch catchc
19、atch语句用于处理语句用于处理trytry代码块中所生成的异常事件,而且代码块中所生成的异常事件,而且catchcatch语句语句可以是多个,可以是多个,catchcatch语句带有一个形式参数,参数类型指明能够捕获语句带有一个形式参数,参数类型指明能够捕获的异常类型,该异常类型必须是的异常类型,该异常类型必须是ThrowableThrowable类的子类,程序运行时,类的子类,程序运行时,系统就会通过参数值把被抛出的异常对象传递给系统就会通过参数值把被抛出的异常对象传递给catchcatch代码块。代码块。FinallyFinally finally finally语句为异常处理提供一个统
20、一的出口,不管语句为异常处理提供一个统一的出口,不管trytry代码块中是代码块中是否发生了异常事件,否发生了异常事件,finallyfinally块中的语句都会被执行。块中的语句都会被执行。任务二任务二异常捕获异常捕获知识点详解知识点详解抛出异常抛出异常例如:抛出异常的声明例如:抛出异常的声明访问不存在的文件。访问不存在的文件。完整的程序代码如下:完整的程序代码如下:import java.io.*;class ExceptionTest3 public static void main(String args)throws IOException /*throws关键字抛出异常关键字抛出异
21、常*/FileInputStream streamobj=new FileInputStream(“readme.txt);System.out.println(“program is running here!”)任务二任务二异常捕获异常捕获知识点详解知识点详解信息卡信息卡异常类异常类“IOException”IOException”为输入输出异常,是异常类为输入输出异常,是异常类“Exception”Exception”的的子类。子类。通过通过throwsthrows语句声明抛出异常,这样就不用在语句声明抛出异常,这样就不用在mainmain方法中用方法中用catchcatch语语句捕获异
22、常,但需要注意,要想上面的程序能够运行通过,需要保证句捕获异常,但需要注意,要想上面的程序能够运行通过,需要保证当前路径下存在当前路径下存在readme.txtreadme.txt文件。如果文件不存在,文件。如果文件不存在,throws throws 语句只语句只能使程序通过编译,而不能通过运行。能使程序通过编译,而不能通过运行。声明抛出异常就是在方法声明中通过声明抛出异常就是在方法声明中通过throwsthrows子句指明,格式如下:子句指明,格式如下:returntype methodName()throws ExceptionName returntype methodName()thr
23、ows ExceptionName 其中,其中,returntypereturntype是方法的返回类型,是方法的返回类型,methodNamemethodName为方法的名称,为方法的名称,ExceptionNameExceptionName为抛出的异常类型。为抛出的异常类型。任务二任务二异常捕获异常捕获知识点详解知识点详解完整的程序代码如下:完整的程序代码如下:class Test4 class Test4 public int devide(int x,int y)throws Exception public int devide(int x,int y)throws Exceptio
24、n if if(y0y0)throw new Devide2(“devide is”+y);throw new Devide2(“devide is”+y);【4 4】int result=x/y;int result=x/y;return result;return result;class Devide2 extends Exception class Devide2 extends Exception【1 1】public Devide2(String msg)public Devide2(String msg)【2 2】super(msg);super(msg);【3 3】任务二任务二
25、异常捕获异常捕获知识点详解知识点详解 class ExceptionTest1 class ExceptionTest1 public static void main(String args)public static void main(String args)try try new Test().devide(3,2);new Test().devide(3,2);catch(exception e)catch(exception e)【5 5】System.out.println(e.getMessage();System.out.println(e.getMessage();Syst
26、em.out.println(“program is running here!”)System.out.println(“program is running here!”)任务二任务二异常捕获异常捕获知识点详解知识点详解代码详解代码详解自定义异常类型,类名为自定义异常类型,类名为Devide2Devide2,自定义的异常类必须继承,自定义的异常类必须继承ExecptionExecption类。类。异常类的构造方法,这个方法接受一个字符串。异常类的构造方法,这个方法接受一个字符串。调用父类的构造函数。调用父类的构造函数。生成自己的异常对象,并抛出这个异常。生成自己的异常对象,并抛出这个异常。
27、根据抛出的异常,生成异常对象根据抛出的异常,生成异常对象e e,并通过,并通过try-catchtry-catch语句捕获住异常。语句捕获住异常。屏幕显示运行结果:屏幕显示运行结果:devide is 2devide is 2。任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线程体的构造知识导读知识导读【案例案例】线程体的构造、启动与访问当前线程对象名线程体的构造、启动与访问当前线程对象名完整的程序代码如下:完整的程序代码如下:class TestThread5class TestThread5public static void main(String args)public s
28、tatic void main(String args)minthread tt=new minthread();minthread tt=new minthread();【2 2】tt.start();tt.start();【3 3】while(true)while(true)System.out.println(“main():”+Thread.currentThread().getnaSystem.out.println(“main():”+Thread.currentThread().getname();me();【5 5】任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线
29、程体的构造知识导读知识导读class minthread extends Threadclass minthread extends Thread【1 1】public void run()public void run()【4 4】while(true)while(true)System.out.println(“Run():”+Thread.currentThread().getnSystem.out.println(“Run():”+Thread.currentThread().getname();ame();任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线程体的构造知识导
30、读知识导读程序运行结果显示:程序运行结果显示:main():mainmain():mainRun():Thread-1Run():Thread-1Run():Thread-1 Run():Thread-1 两个两个System.out.println()System.out.println()语句的内容无规则交替打印输出,说明启语句的内容无规则交替打印输出,说明启动了两个线程,一个是动了两个线程,一个是mainmain方法的内容,一个是方法的内容,一个是runrun方法的内容。方法的内容。注意注意任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线程体的构造知识导读知识导读代码详解代
31、码详解JavaJava的线程是通过的线程是通过java.langjava.lang软件包中的软件包中的ThreadThread类来实现的,可以通类来实现的,可以通过过minthreadminthread类继承了类继承了ThreadThread类,为类,为ThreadThread类的子类。类的子类。创建一个创建一个minthreadminthread子类的对象子类的对象tttt。对象对象tttt通过通过start()start()方法启动线程。方法启动线程。minthread()minthread()子类重写子类重写ThreadThread类的类的RunRun()方法。()方法。currentT
32、hread()currentThread()方法用来返回一个线程类的对象,方法用来返回一个线程类的对象,getname()getname()获取对获取对象的名称。象的名称。任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线程体的构造知识点详解知识点详解多线程概述多线程概述线程的定义:线程的定义:线程与进程相似,是一个执行的程序,是程序中单个顺序的流控制:线程与进程相似,是一个执行的程序,是程序中单个顺序的流控制:但与进程不同的是,同类的多个线程但与进程不同的是,同类的多个线程(multithread)(multithread)是共享一块内存是共享一块内存空间和一组系统资源的,而线段
33、本身的数据通常只有微处理器的寄存空间和一组系统资源的,而线段本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多,正因为如此,程,或者在各个线程之间切换时,负担要比进程小的多,正因为如此,线段被称为轻负荷进程。一个进程线段被称为轻负荷进程。一个进程4 4呵以包含多个线程。呵以包含多个线程。单线程与多线程有什么区别呢?单线程与多线程有什么区别呢?任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线程体的构造知识点详解知识点详解以上例为例,如
34、果类以上例为例,如果类minthreadminthread不是类不是类ThreadThread的子类,同时的子类,同时mainmain函数函数中不用中不用tt.start();tt.start();语句启动另一个线程,而直接用语句启动另一个线程,而直接用new new minthread().run();minthread().run();语句调用语句调用runrun()方法,由于()方法,由于runrun()方法中的()方法中的whilewhile()()循环的条件永远为循环的条件永远为truetrue,因此,程序一直执行,因此,程序一直执行run()run()中的循环语句,中的循环语句,而
35、无法执行而无法执行mainmain函数函数System.out.println(“main():”+Thread.currentThread().getnamSystem.out.println(“main():”+Thread.currentThread().getname();e();语句,此为单线程;而上例中语句,此为单线程;而上例中JavaJava的线程是通过的线程是通过java.langjava.lang软件软件包中的包中的ThreadThread类来实现的,通过类来实现的,通过minthreadminthread类继承了类继承了ThreadThread类,为类,为ThreadThr
36、ead类的子类,同时通过类的子类,同时通过start()start()方法启动了新线程,因此,两个方法启动了新线程,因此,两个线程无规则交替使用,此为多线程。线程无规则交替使用,此为多线程。任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线程体的构造知识点详解知识点详解用用ThreadThread类创建线程类创建线程要将一段代码在一个新的线程上运行,该代码应该在一个类的要将一段代码在一个新的线程上运行,该代码应该在一个类的runrun函数中,并且函数中,并且runrun函数所在的类是函数所在的类是ThreadThread类的子类。即:要实现多类的子类。即:要实现多线程,必须编写一个
37、继承了线程,必须编写一个继承了ThreadThread类的子类,子类要覆盖类的子类,子类要覆盖ThreadThread类中的类中的runrun函数,在子类的函数,在子类的runrun函数中调用想在新线程上运行的程函数中调用想在新线程上运行的程序代码。序代码。启动一个新的线程,我们不是直接调用启动一个新的线程,我们不是直接调用ThreadThread的子类对象的的子类对象的runrun方方法,而是调用法,而是调用ThreadThread类对象的类对象的startstart方法将产生一个新的线程,并方法将产生一个新的线程,并在该线程上运行该在该线程上运行该ThreadThread类对象中的类对象中
38、的runrun方法。方法。任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线程体的构造知识点详解知识点详解格式如下所示:格式如下所示:Thread countTime=new Thread(this);Thread countTime=new Thread(this);/含义是创建一个线程对象含义是创建一个线程对象countTimecountTime,ThreadThread类从类从thisthis所指的对象所指的对象中获得中获得runrun方法。方法。countTime.start();countTime.start();/启动该线程启动该线程任务三任务三多线程设计多线程设计子任
39、务子任务1 线程体的构造线程体的构造知识点详解知识点详解【案例案例】RunnableRunnable接口构造线程。接口构造线程。完整的程序代码如下:完整的程序代码如下:class TestThread6public static void main(String args)Thread tt=new Thread(new minthread();【2】tt.start();while(true)System.out.println(“main():”+Thread.currentThread().getname();任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线程体的构造知识点
40、详解知识点详解class minthread implement Runnable【1】public void run()while(true)System.out.println(“run():”+Thread.currentThread().getname();任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线程体的构造知识点详解知识点详解这是实现线程体的另一种构造方法,不调用这是实现线程体的另一种构造方法,不调用ThreadThread中的中的runrun方法,而是调用方法,而是调用RunnableRunnable中的中的runrun方法作为线程的执方法作为线程的执行代码。程
41、序运行结果与前一案例中创建行代码。程序运行结果与前一案例中创建ThreadThread类子类类子类对象执行线程并无差别。对象执行线程并无差别。注意注意任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线程体的构造知识点详解知识点详解代码详解代码详解提供一个实现提供一个实现RunnableRunnable接口的类作为线程的目标对象。接口的类作为线程的目标对象。创建线程对象,并传递了一个创建线程对象,并传递了一个RunnableRunnable类型的线程对象。类型的线程对象。通过实现通过实现ThreadThread类的子类,重写继承的类的子类,重写继承的runrun方法定义线程方法定义线
42、程体,然后创建该子类的对象创建线程。体,然后创建该子类的对象创建线程。例如:例如:public class MyThread extends Threadpublic class MyThread extends Threadpublic run()public run()System.out.println(MyThread.run();System.out.println(MyThread.run();任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线程体的构造知识点详解知识点详解在合适的地方启动线程:在合适的地方启动线程:new MyThread().start();由于由于
43、Java只支持单重继承,用这种方法定义的类不能再继承其他只支持单重继承,用这种方法定义的类不能再继承其他父类。父类。如果自己的类已经如果自己的类已经extendsextends另一个类,就无法直接另一个类,就无法直接extends extends ThreadThread,此时,必须实现一个,此时,必须实现一个RunnableRunnable接口:接口:public class MyThread extends OtherClass implements Runnable public class MyThread extends OtherClass implements Runnable
44、public run()public run()System.out.println(MyThread.run();System.out.println(MyThread.run();任务三任务三多线程设计多线程设计子任务子任务1 线程体的构造线程体的构造知识点详解知识点详解通过在类中实现通过在类中实现Runnable接口,并在该类中提供接口,并在该类中提供run()方法的实方法的实现,用这种方法定义的类可以再继承其他父类。现,用这种方法定义的类可以再继承其他父类。任务三任务三多线程设计多线程设计子任务子任务2 线程的同步线程的同步知识点详解知识点详解【案例案例】存取数据的部分代码。存取数据的
45、部分代码。完整的程序代码如下:完整的程序代码如下:class Aprivate int s;private boolean bflag=false;public synchronized int get()while(bflag=false)try任务三任务三多线程设计多线程设计子任务子任务2 线程的同步线程的同步知识点详解知识点详解wait();/等待等待put中调用中调用notify()catch(InterruptedException e)bflag=false;notify();return s;public synchronized int put(int value)while(
46、bflag=true)任务三任务三多线程设计多线程设计子任务子任务2 线程的同步线程的同步知识点详解知识点详解trywait();/等待等待get中调用中调用notify()catch(InterruptedException e)s=valuebflag=true;notify();任务三任务三多线程设计多线程设计子任务子任务2 线程的同步线程的同步知识点详解知识点详解在在JavaJava语言中,提供了关键字语言中,提供了关键字synchronizedsynchronized为同步语句块为同步语句块儿,来实现对象的儿,来实现对象的“互斥锁互斥锁”联系,当某个对象或方法用联系,当某个对象或方法
47、用关键字关键字synchronizedsynchronized修饰时表明该对象或方法只能有一个修饰时表明该对象或方法只能有一个线程执行,其他线程处于等待状态。如果线程执行,其他线程处于等待状态。如果synchronizedsynchronized用用在类的声明中,表明这类中的所有方法都是在类的声明中,表明这类中的所有方法都是synchronizedsynchronized的。同步线程的执行需要使用的。同步线程的执行需要使用wait()wait()、notify()notify()、notifyAllnotifyAll()()方法,这些方法的说明如下:方法,这些方法的说明如下:wait()wai
48、t()、notify()notify()、notifyAll()notifyAll()三种方法只能出现在三种方法只能出现在synchronizedsynchronized作用的范围内。作用的范围内。任务三任务三多线程设计多线程设计子任务子任务2 线程的同步线程的同步知识点详解知识点详解wait()wait()、notify()notify()、notifyAll()notifyAll()三种方法只能出现在三种方法只能出现在synchronizedsynchronized作用的范围内。作用的范围内。wait()wait()方法的作用是:释放已持有的锁,进入方法的作用是:释放已持有的锁,进入wai
49、twait队伍。队伍。notify()notify()方法的作用是唤醒方法的作用是唤醒waitwait队列中的第一个线程,并将该线队列中的第一个线程,并将该线程移入互斥锁申请队列。程移入互斥锁申请队列。notifyAll()notifyAll()方法的作用是唤醒方法的作用是唤醒waitwait队列中的所有的线程,并将这队列中的所有的线程,并将这些线程移入互斥锁申请队列。些线程移入互斥锁申请队列。学材小结学材小结理论知识理论知识填空题填空题1 1、JavaJava支持多线程有两个方法支持多线程有两个方法和和_。2 2、在在JavaJava语言中多线程程序设计的两种方法是语言中多线程程序设计的两种
50、方法是_和和_。3 3、线程的四种状态是线程的四种状态是 _ _、_、_、_。4 4、指定线程阻塞多长时间的方法是指定线程阻塞多长时间的方法是_。5 5、在在JavaJava语言中,线程的实现部分(线程体)应书写在方法语言中,线程的实现部分(线程体)应书写在方法_中。中。6 6、在在JavaJava语言中,实现线程的同步执行要用到关键字语言中,实现线程的同步执行要用到关键字_。判断题:判断下面说法是否正确?为什么?判断题:判断下面说法是否正确?为什么?1 1、要在程序中实现线程必须导入要在程序中实现线程必须导入类。类。2 2、线程之间可以共享数据。线程之间可以共享数据。3 3、启动线程时可以调