Java语言程序设计基础教程.pptx
《Java语言程序设计基础教程.pptx》由会员分享,可在线阅读,更多相关《Java语言程序设计基础教程.pptx(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、会计学1Java语言语言(yyn)程序设计基础教程程序设计基础教程第一页,共50页。7.1线程简介线程简介(jin ji)n n到到目目前前为为止止所所介介绍绍过过的的各各种种范范例例都都是是单单线线程程程程序序,也也就就是是启启动动的的JavaJava程程序序在在“同同一一时时间间”内内只只会会做做一一件件事事。文文本本(wnbn)(wnbn)模模式式下下最最常常进进行行的的就就是是单单线线程程程程序序。有有时时需需要要程程序序“同同时时”可可以以作作很很多多事事,即即所所谓谓多多线线程程(Multi-threadMulti-thread)程程序序,在在窗窗口口程程序序、网网络络程程序序中中
2、常常使使用用多多线线程程功功能能,了了解解多多线线程程概概念与注意事项是非常重要的。念与注意事项是非常重要的。第1页/共50页第二页,共50页。7.1.1进程进程(jnchng)与线程与线程n n程序是一段静态的代码,它是应用软件执行的蓝本。程序是一段静态的代码,它是应用软件执行的蓝本。n n进程是程序的一次动态执行过程,它对应了从代码加载、进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。线程是比进程更小的执身从产生、发展至消亡的过程。线程是比进程更小的执行单位行单位,
3、一个进程在其执行过程中,可以产生多个线程,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念的产生、存在和消亡的过程,也是一个动态的概念(ginin)(ginin)。n nJavaJava的多线程就是在操作系统每次分时给的多线程就是在操作系统每次分时给JavaJava程序一个时程序一个时间片的间片的CPUCPU时间内,在若干个独立的可控制的线程之间时间内,在若干个独立的可控制的线程之间切换。切换。第2页/共50页第三页,共50页。7.1.2线程的状态线程的状态(z
4、hungti)n nJava使用Thread类及其子类的对象(duxing)来表示线程,线程在它的一个完整的生命周期中通常要经历如下的4种状态:n n1.创建状态(new Thread)n n2.可运行状态(Runnable)n n3.不可运行状态(Not Runnable)n n4.死亡状态(Dead)第3页/共50页第四页,共50页。7.2 Thread类的子类创建类的子类创建(chungjin)线程线程n n用Thread类或子类创建线程对象.n n编写Thread类的子类时,需要重写父类的run方法,其目的(md)是规定线程的具体操作,否则线程就什么也不做,因为父类的run方法中没有任
5、何操作语句。n n当JVM将CPU使用权切换给线程时,如果线程是Thread的子类创建的,该类中的run方法就立刻执行。第4页/共50页第五页,共50页。7.3实现实现(shxin)Runnable接口接口 n n创建线程的另一个途径就是用创建线程的另一个途径就是用ThreadThread类直接创建线程类直接创建线程对象。使用对象。使用ThreadThread类创建线程对象时,常用的构造方类创建线程对象时,常用的构造方法是:法是:n nThread(Runnable target);Thread(Runnable target);n n该构造方法中的参数是一个该构造方法中的参数是一个Runna
6、bleRunnable类型的接口,因类型的接口,因此,在创建线程对象时,必须向构造方法的参数传递此,在创建线程对象时,必须向构造方法的参数传递一个实现一个实现RunnableRunnable接口类的实例,该实例对象称为接口类的实例,该实例对象称为(chn(chn wi)wi)所创线程的目标对象。所创线程的目标对象。第5页/共50页第六页,共50页。【例【例7-3】通过接口】通过接口(ji ku)构造构造线程体线程体n nimport java.awt.Graphics;import java.awt.Graphics;n nimport java.util.Date;import java.u
7、til.Date;n npublic class ep7_3 extends java.applet.Applet implements Runnable/public class ep7_3 extends java.applet.Applet implements Runnable/实现实现(shxin)(shxin)接口接口n nThread clockThread;Thread clockThread;n npublic void start()public void start()n nif(clockThread=null)if(clockThread=null)n nclockT
8、hread=new Thread(this,Clock);clockThread=new Thread(this,Clock);n nclockThread.start();/clockThread.start();/启动线程启动线程n n n n 第6页/共50页第七页,共50页。n npublic void run()/run()public void run()/run()方法中是线程执行方法中是线程执行(zhxng)(zhxng)的内容的内容n nwhile(clockThread!=null)while(clockThread!=null)n nrepaint();/repaint(
9、);/刷新显示画面刷新显示画面n ntry try n nclockThread.sleep(1000);/clockThread.sleep(1000);/睡眠睡眠1 1秒,即每隔秒,即每隔1 1秒秒执行执行(zhxng)(zhxng)一次一次n n catch(InterruptedException e)catch(InterruptedException e)n n n n n n 第7页/共50页第八页,共50页。n npublic void paint(Graphics g)public void paint(Graphics g)n nDate now=new Date();/D
10、ate now=new Date();/获得当前的时间获得当前的时间(shjin)(shjin)对象对象n ng.drawString(now.getHours()+:+now.getMinutes()+:g.drawString(now.getHours()+:+now.getMinutes()+:n n+now.getSeconds(),5,10);/+now.getSeconds(),5,10);/显示当前时间显示当前时间(shjin)(shjin)n n n npublic void stop()public void stop()n nclockThread.stop();clock
11、Thread.stop();n nclockThread=null;clockThread=null;n n n n 第8页/共50页第九页,共50页。n n本程序是本程序是AppletApplet,要运行,要运行(ynxng)Applet(ynxng)Applet程序,必须定义一个程序,必须定义一个htmlhtml文件,文件,ep7_3.htmlep7_3.html文件内容如下:文件内容如下:n nn n n n n n n n n n applet codebase=.height=100n n n n n n第9页/共50页第十页,共50页。n n上面这个(zh ge)例子是通过每隔1秒
12、种就执行线程的刷新画面功能,显示当前的时间;看起来的效果就是一个时钟,每隔1秒就变化一次。由于采用的是实现接口Runnable的方式,所以该类Clock还继承了Applet,Clock就可以Applet的方式运行。第10页/共50页第十一页,共50页。构造线程体的两种方法构造线程体的两种方法(fngf)的比较:的比较:n n1.1.使用使用RunnableRunnable接口接口 n n1)1)可以将可以将CPUCPU,代码和数据分开,形成清晰,代码和数据分开,形成清晰(qngx)(qngx)的模型的模型;n n2)2)还可以从其他类继承还可以从其他类继承;n n3)3)保持程序风格的一致性。
13、保持程序风格的一致性。n n2.2.直接继承直接继承ThreadThread类类 n n1)1)不能再从其他类继承不能再从其他类继承;n n2)2)编写简单,可以直接操纵线程,无需使用编写简单,可以直接操纵线程,无需使用Thread.currentThread()Thread.currentThread()。第11页/共50页第十二页,共50页。7.4基本基本(jbn)的线程控制的线程控制 n n可以通过线程的方法进行基本的线程控制,下面我们熟悉一下常用的方法。n n1start()方法 n n线程调用(dioyng)该方法将启动线程,从新建状态进入就绪队列排队。一旦CPU资源轮转到它时,就脱
14、离主线程开始自己的生命周期。第12页/共50页第十三页,共50页。n n2 2run()run()方法方法方法方法 n n系统的系统的系统的系统的ThreadThread类中,类中,类中,类中,run()run()方法没有具体内容,用户需要在程序中方法没有具体内容,用户需要在程序中方法没有具体内容,用户需要在程序中方法没有具体内容,用户需要在程序中重写重写重写重写run()run()方法来覆盖原来的方法来覆盖原来的方法来覆盖原来的方法来覆盖原来的run()run()方法,方法,方法,方法,run()run()方法中定义线程对象方法中定义线程对象方法中定义线程对象方法中定义线程对象被调度之后所执
15、行的操作,是系统自动调用而用户不能引用的方被调度之后所执行的操作,是系统自动调用而用户不能引用的方被调度之后所执行的操作,是系统自动调用而用户不能引用的方被调度之后所执行的操作,是系统自动调用而用户不能引用的方法。当法。当法。当法。当run()run()方法执行完毕,线程就变成死亡状态,在线程没有结方法执行完毕,线程就变成死亡状态,在线程没有结方法执行完毕,线程就变成死亡状态,在线程没有结方法执行完毕,线程就变成死亡状态,在线程没有结束束束束run()run()方法之前,不要让线程再调用方法之前,不要让线程再调用方法之前,不要让线程再调用方法之前,不要让线程再调用start()start()方
16、法,否则将发生方法,否则将发生方法,否则将发生方法,否则将发生IllegalThreadStateExceptionIllegalThreadStateException异常,这一点异常,这一点异常,这一点异常,这一点(y di(y di n)n)在写程序的时候在写程序的时候在写程序的时候在写程序的时候需要注意。需要注意。需要注意。需要注意。第13页/共50页第十四页,共50页。n n3sleep(int millsecond)方法方法 n nsleep方法可以方法可以(ky)暂停一个线程的执行,暂停一个线程的执行,在适当的时候再恢复其执行。就是让当前在适当的时候再恢复其执行。就是让当前线程睡
17、眠(停止执行)若干毫秒,线程由线程睡眠(停止执行)若干毫秒,线程由运行中状态进入不可运行状态,停止执行运行中状态进入不可运行状态,停止执行时间到后线程进入可运行状态。时间到后线程进入可运行状态。第14页/共50页第十五页,共50页。n n4isAlive()方法方法 n n测试线程状态。可以通过测试线程状态。可以通过Thread 中的中的isAlive()方法来获取方法来获取(huq)线程是否处于活动状线程是否处于活动状态;线程由态;线程由start()方法启动后,直到其被终方法启动后,直到其被终止之间的任何时刻,都处于止之间的任何时刻,都处于Alive状态。线状态。线程处于新建状态时,调用程
18、处于新建状态时,调用isAlive()方法返回方法返回false,线程进入死亡状态后,调用,线程进入死亡状态后,调用isAlive()方法返回方法返回false。第15页/共50页第十六页,共50页。n n5currentThread()方法方法 n ncurrentThread()方法是方法是Thread类的类方法,类的类方法,可以直接通过类名调用可以直接通过类名调用(dioyng),该方法,该方法返回当前正在使用返回当前正在使用CPU资源的线程。资源的线程。第16页/共50页第十七页,共50页。n n6Interrupt()方法方法 n ninterrupt()方法常用来方法常用来“吵醒吵
19、醒”休眠的线程。休眠的线程。但线程调用但线程调用sleep方法处于休眠状态时,一方法处于休眠状态时,一个占有个占有CPU资源的线程可以让休眠的线程资源的线程可以让休眠的线程调用调用interrupt方法唤醒自己。导致休眠的线方法唤醒自己。导致休眠的线程发生程发生InterruptedException异常异常(ychng),结束休眠,重新排队等待,结束休眠,重新排队等待CPU资源。资源。第17页/共50页第十八页,共50页。n n7stop()方法方法 n n通过调用线程的实例通过调用线程的实例(shl)方法方法stop()来终来终止线程。线程终止后,其生命周期结束了,止线程。线程终止后,其生
20、命周期结束了,即进入死亡态,终止后的线程不能再被调即进入死亡态,终止后的线程不能再被调度执行。度执行。第18页/共50页第十九页,共50页。n n8 8join()join()方法方法方法方法 n n一个线程在占有一个线程在占有一个线程在占有一个线程在占有CPUCPU资源期间,可以让其他线程调用资源期间,可以让其他线程调用资源期间,可以让其他线程调用资源期间,可以让其他线程调用join()join()方法和本线程联合。当前线程等待调用方法和本线程联合。当前线程等待调用方法和本线程联合。当前线程等待调用方法和本线程联合。当前线程等待调用该方法的线程结束后,再重新排队等待该方法的线程结束后,再重新
21、排队等待该方法的线程结束后,再重新排队等待该方法的线程结束后,再重新排队等待CPUCPU资源,以便恢复执行。如果当前线程准备联合的线程已资源,以便恢复执行。如果当前线程准备联合的线程已资源,以便恢复执行。如果当前线程准备联合的线程已资源,以便恢复执行。如果当前线程准备联合的线程已经结束,也就是经结束,也就是经结束,也就是经结束,也就是startstart方法体已经执行完,那么不会产生任何方法体已经执行完,那么不会产生任何方法体已经执行完,那么不会产生任何方法体已经执行完,那么不会产生任何(rnh)(rnh)效果。效果。效果。效果。n nTimerThread tt=new TimerThrea
22、d(100);TimerThread tt=new TimerThread(100);n ntt.start();tt.start();n n n npublic void timeout()public void timeout()n ntt.join();/tt.join();/当前线程等待线程当前线程等待线程当前线程等待线程当前线程等待线程tt tt 执行完后再继续往下执行执行完后再继续往下执行执行完后再继续往下执行执行完后再继续往下执行n n 第19页/共50页第二十页,共50页。【例【例7-5】线程联合】线程联合(linh)的例的例子。子。n npublic class ep7_5
23、public class ep7_5 n npublic static void main(String args)public static void main(String args)n nThreadJoin a=new ThreadJoin();ThreadJoin a=new ThreadJoin();n na.customer.start();a.customer.start();n na.tvMaker.start();a.tvMaker.start();n n n n 第20页/共50页第二十一页,共50页。n nclass ThreadJoin implements Runn
24、able class ThreadJoin implements Runnable n nTV tv;TV tv;n nThread customer,tvMaker;Thread customer,tvMaker;n nThreadJoin()ThreadJoin()n ncustomer=new Thread(this);customer=new Thread(this);n ntvMaker=new Thread(this);tvMaker=new Thread(this);n ncustomer.setName(customer.setName(顾客顾客(gk);(gk);n ntvM
25、aker.setName(tvMaker.setName(电视制造厂电视制造厂););n n 第21页/共50页第二十二页,共50页。nnpublic void run()public void run()nnif(Thread.currentThread()=customer)if(Thread.currentThread()=customer)nnSystem.out.println(customer.getName()+System.out.println(customer.getName()+等等+tvMaker.getName()+tvMaker.getName()nn+生产电视生产
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 语言程序设计 基础教程
限制150内