《电工与电子技术电子商务电子课件JAVA语言程序设计java07ppt.ppt》由会员分享,可在线阅读,更多相关《电工与电子技术电子商务电子课件JAVA语言程序设计java07ppt.ppt(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、PPT模板下载:/moban/行业PPT模板:/hangye/节日PPT模板:/jieri/PPT素材下载:/sucai/PPT背景图片:/beijing/PPT图表下载:/tubiao/优秀PPT下载:/xiazai/PPT教程:/powerpoint/Word教程:/word/Excel教程:/excel/资料下载:/ziliao/PPT课件下载:/kejian/范文下载:/fanwen/试卷下载:/shiti/教案下载:/jiaoan/字体下载:/ziti/电子课件JAVA语言程序设计java07第7章多线程7.1并发性、线程与多线程7.2获得线程体的两种方法7.3线程调度本章目录7.1
2、并发性、线程与多线程一、并发性的概念目前的计算机操作系统大多支持并发性,即多个进程是交叉执行的,一般称多进程为系统级并发。Java语言通过程序控制流来执行程序,单个的一段程序执行控制流称为线程。多线程指的是在单个程序内部可以同时运行多个相同或不同的线程来执行不同的任务。线程与操作系统中的进程有些类似,在同一时刻操作系统中可以运行多个进程,但是线程则更进一步,将并发推进到语言级,所以说Java语言支持语言级并发。在单个程序内部也可以在同一时刻有多个线程在进行不同的运算。多线程也需要系统通过分配处理器的运行时间进行调度以提高整个程序的运行效率。二、线程的状态与生命周期一个线程在其生命生存时段内的任
3、一时刻都处于某一种线程状态,线程在从其生命开始到结束的时间内将可能经历从出生态到死亡态的多种状态,这构成了它的生命周期。线程的状态包括以下7种:出生态(Born state),也称为新线程(New Thread)。就绪态(Ready state),也称为可运行线程(Runnable Thread)。运行态(Running state)。休眠态(Sleeping state)。等待态(Waiting state)。阻塞态(Blocked state)。死亡态(Dead state)。特别的线程关系:某个线程只有在另一个线程终止时,才能继续执行,这种线程称为依赖线程。此时依赖线程可以调用另一个线程
4、的join()方法。当另一个线程转化为死亡态时,依赖线程会脱离等待态而转化为就绪态。在一个系统中,任何时刻最多都只能有一个运行态线程。出生态出生态就绪态就绪态阻塞态阻塞态死亡态死亡态运行态运行态休眠态休眠态等待态等待态start()获得处理器yield()完成任务或终止等待任务wait()sleep()任务完成interrupt()休眠时间到interrupt()等待时间到interrupt()notify()notifyall()线程生命周期中的状态转化示意图7.2获得线程体的两种方法一、Thread类和Runnable接口线程从根本上讲是一段程序代码序列,还需要在程序中实现。java.la
5、ng包中定义了Thread类,是Java语言多线程程序设计的基础和关键。Thread类是java.lang.Object类的直接子类,其中定义的一些方法成员完成与线程有关的操作:interrupt()/中断线程join()/等待该线程终止join(long millis)/等待该线程终止,在指定的毫秒数内join(long millis,int nanos)/等待该线程终止,在指定的毫秒数加指定的纳秒数内sleep(long millis)/休眠当前正在执行的线程,在指定的毫秒数内sleep(long millis,int nanos)/休眠当前正在执行的线程,在指定的毫秒数加指定的纳秒数内s
6、tart()/使该线程开始执行yield()/暂停当前正在执行的线程,并执行其他线程notify()/唤醒在此对象监视器上等待的单个线程notifyAll()/唤醒在此对象监视器上等待的所有线程wait()/导致当前的线程等待wait(long timeout)/导致当前的线程等待timeout毫秒wait(long timeout,int nanos)/导致当前的线程等待timeout毫秒加nanos纳秒isAlive()/测试线程是否处于活动状态isInterrupted()/测试线程是否已经中断getPriority()/返回线程的优先级getId()/返回线程的标识符getName()
7、/返回线程的名称getState()/返回线程的状态setPriority(int newPriority)/更改线程的优先级setName(String name)/改变线程名称,使之与参数name相同在java.lang包中还定义了Runnable接口,其中只有一个run()方法,这个run()方法的作用与Thread类中的run()方法在定义线程体时的作用是一样的。Java语言支持多线程,线程在Application程序和Applet程序中都可以使用,在Applet中使用得更普遍一些。线程的行为由线程体确定,线程体是线程的主体,含有线程的具体内容。Java语言程序中实现线程的程序设计的关
8、键是使主程序获得run()方法并重写run()方法,重写了run()方法也就定义了线程体。根据获得run()方法的途径不同,定义线程体有两种完全等价的方式。二、通过继承Thread类获得线程体在java.lang.Thread类中定义有run()方法,可以在当前程序中通过继承Thread类间接继承run()方法,并在程序中重写该方法而构造出线程体。三、通过实现Runnable接口获得线程体由于Java语言不支持多重继承,因此如果用来获得线程体的类已经继承了其他的类,这个方法在使用中就会受限制。可以在当前程序中实现Runnable接口并重写run()方法,从而构造出线程体。这种方法比较多见于编写
9、Applet程序,当一个Applet程序的线程体必须要在主类中实现的时候,就别无选择地要使用实现Runnable接口的方法,与前一种方法相比,这种方法的效果是一样的。多个线程同时在一个程序中执行,要通过系统的线程调度获得处理器才能执行,所以完全可能出现一个线程还没有执行完就被迫停下来而由另一个线程取而代之获得处理器的情况,所以就会出现同一个线程所执行的内容的顺序是固定的,而多个线程的执行内容的顺序就可能出现不同的组合的结果,这种现象称为线程的不确定性。7.3线程调度一、线程的优先级每个线程都有自己的优先级。当Java线程被创建时,该线程从父线程中继承优先级并保持一致。线程被创建后,可以改变线程
10、的优先级。线程的优先级定义为10级,分别用数字1到10表示。在Thread类中还定义了几个描述线程的优先级的字段:最高优先级MAX_PRIORITY对应10级,默认优先级NORM_PRIORITY对应5级,最低优先级MIN_PRIORITY对应1级。线程的优先级的作用是方便操作系统调度线程,操作系统总是让优先级高的线程先于优先级低的线程执行。对于优先级相同的线程,在不采用分时技术的操作系统中总是让一个线程一直运行直到完成任务,除非它自己转化为休眠态、等待态或阻塞态;在采用分时技术的操作系统中每个线程都将获得称为时间片的处理器运行时间以使线程能够运行。可以通过调用Thread类的getPrior
11、ity()方法获取线程的优先级,setPriority()方法更改线程的优先级。二、线程同步线程在访问共享对象时不允许其它线程访问该对象的情况称为线程互斥或线程同步。线程同步与计算机操作系统中的进程同步很相似。Java语言采用监控器机制来实现线程同步,监控器机制也称为获得锁。在Java语言中为每个对象都设置了一个监控器,监控器每次只允许一个线程来执行对象的同步语句,当程序控制流进入同步语句时,将对象锁住,从而实现线程同步。任意一个时刻如果有多条语句试图使对象同步则只能有一条同步语句被激活,其它所有试图对同一对象实现同步的线程都将被迫处于阻塞态。当实现线程同步的语句完成执行过程之后,监控器才会打
12、开对象的锁并按照线程调度原则处理其它的同步语句,分配处理器时间。在Java语言程序设计中,可以采用“synchronized”关键字实现同步方法,具体用法就是在程序中进行方法定义时用“synchronized”关键字说明方法,使得方法具有同步属性,任一时刻只有一个线程能够调用带有同步属性的方法。还可以在程序中使用wait()方法使一个暂时没有获得完全的条件,无法对该对象继续执行任务的线程进入等待态。当一个线程完成了自己的同步语句并执行完自己的代码使得其它的线程所等待的条件得以满足之后,也可以通过使用notify()方法将一个正处于等待态的线程再次转为就绪态。也可以通过使用notifyAll()
13、方法将所有处于等待态的线程再次转为就绪态。转为就绪态的线程都有机会获得对象的锁,但是任一时刻最多只能有一个线程获得对象的锁,其余的线程都将处于阻塞态。有几个问题是在编写线程同步程序时应该注意的:当对象的锁被释放时,阻塞线程调用一个用“synchronized”关键字说明的方法并不保证一定就能立刻成为下一个获得锁的线程。调用了监控器的wait()方法成为等待态的线程经由其它线程调用notify()方法之后并不保证一定会脱离等待态。在同步方法中建议在wait()方法之前调用notifyAll()方法唤醒所有等待态线程,包括该线程自身,而将同步线程的控制选择权交由标记变量控制。使用while(!条件)wait()notify()结构来完成同步方法的定义,这样做要比使用if(!条件)wait()notify()结构来完成定义要安全。不要在线程同步的程序中调用sleep()方法,这样做通常是错误的。wait()方法通常要抛出中断异常InterruptedException,所以在wait()方法外部要进行捕获和处理异常的操作。