Chapter7_多线程与异常处理

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Java语言程序设计清华大学出版社第7章多线程与异常处理第7章多线程与异常处理1、多线程的概念2、线程的使用3、线程同步4、异常处理7.1多线程的概念1、线程与多线程2、线程的生命周期3、线程的优先级1、线程与多线程•什么是进程进程是程序的一次执行进程是程序在一个数据集合上运行的过程。进程是系统资源分配和调度的独立单位。•什么是线程在多线程的操作系统中,一个进程中包含多个线程。线程是独立运行的基本单位。进程作为资源分配的基本单位。同一进程的多个线程共享该进程所拥有的资源。•进程与多线程的区别Java的多线程机制•在Java编程中,每实例化一个线程对象,就创建一个虚拟的CPU,由虚拟CPU处理本线程数据。•每个Java程序都有一个主线程,即由main()方法所对应的线程。对于applet,浏览器即是主线程。•除主线程外,线程无法自行启动,必须通过其他程序来启动它。2、线程的生命周期•线程要经历创建、就绪、运行、阻塞和死亡等5个状态,称为生命周期。创建状态•通过new命令创建一个线程对象,创建后的线程就处于创建状态。–Threadthread1=newThread();就绪状态•处于创建状态的线程对象通过调用start()方法就进入了就绪状态。–Threadthread1=newThread();thread1.start();•进入就绪状态的线程对象被放到一个等待队列中,等待系统为其分配对处理器的控制权。运行状态•线程处于运行状态,该进程对应的代码目前正在运行。除非运行过程中对处理器的控制权被一个优先级更高的线程抢占,否则该线程将一直运行完毕然后释放对处理器的控制权。–run()阻塞状态•正在运行的线程由于发生某事件而暂时无法继续执行时,便放弃处理器处于暂停状态。这种暂停状态称为阻塞状态。常见的导致线程阻塞的典型事件为:I/O请求,申请缓冲空间等。–sleep(),wait()方法•当I/O完成,获得缓冲空间后,线程就由阻塞状态转变为就绪状态。死亡状态•线程执行完毕或被另一线程强行终止执行,线程退出运行状态,并不再进入就绪队列。–run()方法执行结束,线程会被撤销。–执行System.exit()方法强行退出,导致进程强行终止3、线程的优先级•Java提供一个线程调度器来监控进入就绪状态的所有线程。•线程调度器根据线程的优先级决定调度哪个线程执行。•线程的执行方式:–时间片方式–非时间片方式(独占式)•在Java中,线程优先级的范围为1~10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORITY。默认优先级为5,即Thread.NORM_PRIORITY。getPriority()方法可以获得线程的优先级setPriority()方法可以设置线程的优先级7.2线程的使用方法•1、创建Thread子类构造线程•2、实现Runnable接口构造线程基本方法:创建线程类子类,再用其他类调用线程。1、创建Thread子类构造线程•线程的创建与启动–(1)创建一个Thread类的子类;Thread类位于java.lang包中–(2)在子类中父类中的run()方法,run()方法中包含了线程要实现的操作;–(3)用关键字new创建一个线程对象;–(4)调用start()方法启动线程。线程启动后当执行完run()方法后,线程会进入死亡状态。示例【例7-1】创建二个Thread类的子类,然后测试它。这个例子说明了这样几个事实:•(1)创建独立执行线程比较容易,Java负责处理了大部分细节。•(2)各线程并发运行,共同争抢CPU资源,线程抢夺到CPU资源后,就开始执行,无法准确知道某线程能在什么时候开始执行。•(3)线程间的执行是相互独立的。•(4)线程独立于启动它的线程(或程序)。•线程的暂停与恢复–publicstaticvoidsleep(longmillis):线程休眠millis毫秒。–publicstaticvoidsleep(longmillis,intnanos)线程休眠millis毫秒及nanos纳秒。Threadthread1=newThread();thread1.start();try{thread1.sleep(200,100);}catch(InterruptedExceptione){}–yield():暂停当前正在执行的线程对象,并执行其他线程。–wait():使线程进入等待状态直到被另一进程唤醒。–notify():把线程的变化通知并唤醒等待的某个线程。2、实现Runnable接口构造线程•Runnable接口:–位于java.lang包中,定义如下:packagejava.lang;publicinterfaceRunnable{publicabstractvoidrun();}•所有实现了Runnable接口的类的对象都可以以线程方式执行。•1、实现Runnable接口•2、定义run()方法publicclassTreadCountingimplementsRunnable{……publicvoidrun(){//在此处添加run()方法代码}}•3、构造线程:Thread(Runnable对象名);Thread(Runnable对象名,String线程名);•4、启动线程:线程对象.start();示例•【例7-2】•创建一个实现Runnable接口的线程类。二种线程方式的用法区别(选讲)•用多线程设计一个模拟火车站售票大厅的工作情形1、应用线程的子类•classSaleextendsThread•{•ints=100;•publicvoidrun(){•System.out.println(getName()+售机票第+s--+号);•}•}classE3{publicstaticvoidmain(String[]args){Salet1=newSale();t1.start();}}2、应用Runnable接口•classThreadsaleimplementsRunnable•{•inttickets=100;•publicvoidrun()•{....}•}publicclassE9_4{publicstaticvoidmain(String[]args){Threadsalet=newThreadsale();//实例化线程Threadt1=newThread(t,第1售票窗口);Threadt2=newThread(t,第2售票窗口);Threadt3=newThread(t,第3售票窗口);Threadt4=newThread(t,第4售票窗口);t1.start();t2.start();t3.start();t4.start();}}7.3异常处理•异常(Exception)指程序运行过程中出现的非正常现象。在Java中,把异常分为错误(Error)与异常(Exception)两大类。•错误(Error)通常指程序本身存在非法的情形。•异常情况(Exception)表示另外一种“非同寻常”的错误。这种错误通常是不可预测的。常见的异常情况包括内存不足,找不到所需的文件等。•Throwable类派生了Error类和Exception类。•Error类描述内部错误,由系统保留,程序不能抛出Error类对象。•Exception类供程序使用。程序运行过程中出现异常可抛出Exception类的对象。Exception类常用方法•publicException()•publicException(Strings)•publicStringtoString()返回描述该Exception对象信息的字符串•publicvoidprintStackTrace()在当前的标准输出设备上打印出当前异常对象的堆栈使用轨迹系统定义的异常类•Exception类派生了若干个子类,每个子类代表了一种特定的运行错误。–FileNotFoundException–IOException–InterruptedException–UnknownHostException–SecurityException–ClassNotFoundException–……系统自动抛出的异常•例7-9:•classExample7_9•{•publicstaticvoidmain(String[]args)•{•inta=5,d=0;•System.out.println(a/d);•}•}•异常处理一般结构•try{可能出现异常的程序代码}catch(异常类1变量1){异常类1对应的异常处理代码}catch(异常类2变量2){异常类2对应的异常处理代码}...[finally]{无论异常是否发生都要执行的代码}异常处理•例7-10:•classA•{•publicstaticvoidmain(String[]args)•{•inta=20,b=0;•try•{System.out.println(a/b);}•catch(Exceptione)•{•System.out.println(“除数为0);•}•finally•{•System.out.println(“例7-10程序结束”);•}•}•}•例7-11/*数组下标越界引发异常*/•classExample7_11•{•publicstaticvoidmain(String[]args)•{•inta[]={1,2,3,4,5};•intsum=0;••try•{•for(inti=0;i=5;i++)•{sum+=a[i];}•System.out.println(sum=+sum);•}•catch(ArrayIndexOutOfBoundsExceptione)•{System.out.println(发生异常原因:+e);}•finally•{System.out.println(程序运行结束!);}•}•}第七章结束!

1 / 35
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功