java高级编程2课件

PPT
  • 阅读 87 次
  • 下载 0 次
  • 页数 22 页
  • 大小 327.500 KB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档8.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
java高级编程2课件
可在后台配置第一页与第二页中间广告代码
java高级编程2课件
可在后台配置第二页与第三页中间广告代码
java高级编程2课件
可在后台配置第三页与第四页中间广告代码
java高级编程2课件
java高级编程2课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 22
  • 收藏
  • 违规举报
  • © 版权认领
下载文档8.00 元 加入VIP免费下载
文本内容

【文档说明】java高级编程2课件.ppt,共(22)页,327.500 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-2293.html

以下为本文档部分文字说明:

Java多线程第1页,共22页。Java线程模型理解线程概念进程的概念线程的概念线程与进程的区别和联系一个进程在其执行过程中,可以产生多个线程。在进程概念中,每一个进程的内部数据和状态都是完全独立的。但与进程不同的是,同类的多个

线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。第2页,共22页。线程是比进程更小的执行单位,是进程内部独立的,有序的指令流。由此,一个进程能包含多个并发执行的

线程。线程是一种能够独立运行的子任务。多线程是一种允许在程序中并发执行彼此间互相独立的多个线程机制。多个线程的执行是并发的。多个线程之间的代码是乱序执行的,由此线程调度,同步等问题需要进行特殊处理。第

3页,共22页。1.线程的生命周期线程的5种状态及转换方法新生态NowBron运行态Running可运行态Runnable阻塞态Blocked死亡态Deadsuspend()sleep()wait()resume()n

otify()start()yield()stop()stop()stop()第4页,共22页。1.新生状态当利用new运算符创建线程对象实例后,它仅仅作为一个对象实例存在,JVM没有为其分配CPU时间片等线程运行资源,该线程处于新

生状态。2.可运行状态在处于新生状态的线程中调用start()方法将线程的状态转换为可运行状态。这时,线程已经得到除CPU时间之外的其它系统资源,只等JVM的线程调度管理器按照线程的优先级对该线程进行调度,从而使该线程拥有能够获得CPU时间片的机会。3.运行状态JVM的线程调度管理器

选中一个可运行状态线程,使其占有CPU并转换为运行状态。运行状态的线程执行自己的run()方法中的代码,直到调用其他方法而终止、或等待某资源而阻塞或完成任务而死亡。第5页,共22页。4.睡眠状态处于运行状态的线程在某些情况下,如执行了sleep()方法,或等待I/O设备等资源,将让出

CPU并暂时终止自己的运行,进入阻塞状态,也称为不可运行状态。处于阻塞状态的线程是不可执行的,即使CPU空闲,也不能执行。只有当引起阻塞的原因被消除时,线程转入可运行状态,重新进入线程队列中排队等待运行,再次运行时从原来终止处继续运行。5.死亡状态死亡状态是线程生命周期中的最后一个阶段。导

致线程死亡的有2种情况:一是正常运行的线程完成了它的全部工作,这个任务完成的动作是由run()方法实现的;另一个是线程被强制性地终止,如通过执行stop()方法来终止一个线程。可以用isAlive()方法测试线程是否已启动。如

果isAlive()方法返回false,表示该线程是新创建或已被终止;如果返回true,表示该线程已启动且未被终止,是可运行状态、运行状态或阻塞状态之一,但不能作进一步的分辨。第6页,共22页。2.线程控制(1)start()方法start()方法对应于启

动操作(2)stop()方法stop()方法终止在任何状态的线程,使之转入到死亡状态(3)sleep()方法sleep()方法使线程暂停运行一段固定的时间。在休眠时间内,由于线程不能得到CPU时间而不运行,指定的时间一过,线程重新进入可运行状态。publicstat

icvoidsleep(longmillis)throwsInterruptedExceptionpublicstaticvoidsleep(longmillis,intnanos)throwsInterruptedException(4)yield()方法yield()方

法使得线程放弃当前分得的CPU时间,但是不使线程阻塞,即线程仍处于可运行状态,随时可能再次分得CPU时间第7页,共22页。(5)wait()方法wait()方法使得当前线程进入阻塞状态,直到被唤醒或等够了timeout指定的时间。注

意:wait()等价于wait(0),它使得线程永远等待直到被唤醒为止。publicfinalvoidwait(longtimeout)throwsInterruptedExceptionpublicfinalvoidwait(longtimeout

,intnanos)throwsInterruptedExceptionpublicfinalvoidwait()throwsInterruptedException(6)notify()方法和notifyAll()方法no

tify()方法和notifyAll()方法对应于唤醒操作。(7)suspend()方法和resume()方法suspend()方法和resume()方法配套使用,suspend()方法使得线程进入阻塞状态,并且不会自动恢复,必须其

对应的resume()方法被调用,才能使得线程重新进入可执行状态。第8页,共22页。(8)interrupt()方法和interrupted()方法interrupt()方法为线程设置一个中断标记,以便于run()方法运行时使用isInterrupted()方法能够检测到,此时,线程在sleep(

)之类的方法中被阻塞时,由sleep()方法抛出一个InterruptedException异常,然后捕获这个异常以处理超时。(9)isAlive()方法isAlive()方法用来判断一个线程的run()方法是否还在执行,如果是在运行,则返回true,否则返回fals

e。第9页,共22页。3.线程的创建在Java中创建线程的方法有2种:一是通过创建Thread类的子类来实现,二是通过实现Runnable接口的类来实现。用继承Thread类的子类或通过实现Run

nable接口的类来创建线程无本质的区别。但是由于Java语言不允许多重继承,所以,如果类已经继承了别的类,这样它就不能再继承Thread了。这时,就要用Runnable接口的方式。第10页,共22页。(1)Thread类与Runnable接口Thread

类用于创建和控制线程。一个线程必须从run()方法开始执行,而run()方法声明在java.lang.Runnable接口中。Runnable接口中只声明了一个run()方法。任何实现Runnable接口的对象都可以作为一个线程的目标对象。一个线程对象必须实现run()方法来完成

线程的所有活动,已实现的run()方法称为该对象的线程体。第11页,共22页。Thread类在java.lang包中定义,Thread类的构造方法如下:(1)Thread()(2)Thread(Runnabletarget)(3)Thread(Runnable

target,Stringname)(4)Thread(Stringname)(5)Thread(ThreadGroupgroup,Runnabletarget)(6)Thread(ThreadGroupgroup,Runnab

letarget,Stringname)(7)Thread(ThreadGroupgroup,Stringname)任何实现Runable接口的对象对可以作为Thread类构造方法中的target参

数,而Thread类本身也实现了Runable接口。因此,可以有2种方式提供run()方法来实现多线程。第12页,共22页。(2)继承Thread类实现多线程Thread类是一个具体的类,即不是抽象类,

该类封装了线程的行为。要创建一个线程:Thread类包含了线程运行所需要的方法,当一个类继承了Thread类后就可以在重写父类中的run()方法来执行指定的操作。需要注意的是线程子类的对象需要通过调用自己的start

()方法让线程执行,start()方法会自动调用run()方法。。第13页,共22页。例通过继承Thread实现多线程publicclassSimpleThreadextendsThread{intcount=1,number;publicSimpleThread(intnum){nu

mber=num;System.out.println("创建线程"+number);}publicvoidrun(){while(true){System.out.println("线程"+number+":计数"+count);if(++count==4)return

;}}publicstaticvoidmain(Stringargs[]){for(inti=0;i<3;i++)newSimpleThread(i+1).start();}}第14页,共22页。(3)通过Runnable

接口实现多线程用Runnable接口创建线程实现线程的另外一种方法是通过使用Thread类的一个构造方法publicThread(Runnabletarget)来创建一个新的线程,其中创建参数target的类负责实现Runnable接口。Runnable接口中只有一个

run()方法,实现该接口的类必须实现接口中的run()方法,在其中定义具体操作,然后将实现了Runnable接口的类的对象作为参数创建一个Thread类的对象,调用该Thread类对象的start()方法启动线程。第15

页,共22页。例通过实现Runnable接口实现多线程publicclassRunnable1implementsRunnable{intk=0;publicRunnable1(intk){this.k=k;}publicvoidrun(){inti=k;

while(i<50){System.out.print(i+"");i+=2;}}publicstaticvoidmain(Stringargs[]){Runnable1r1=newRunnable1(1);//创建具有线程体的目标对象Runnable1r2=ne

wRunnable1(2);Threadt1=newThread(r1);//以目标对象创建线程Threadt2=newThread(r2);t1.start();t2.start();for(inti=0;i<40;i++)System.out.print("A");}}

第16页,共22页。两种线程实现方式的对比分析通过继承Thread类来实现多线程的编程这种方法简单明了,但是它也有一个很大的缺点,那就是如果相应的多线程处理类已经继承了一个类,便无法再继承Thread这个类,所以我们一般情况下采用Runnable接口的方法来实现多线程的

编程。使用Runnable接口的来实现多线程在开发过程中能够在一个类中包容所有的代码,以便封装。但是使用Runnable接口的方法的缺点在于如果想创建多个线程并使各个线程执行不同的的代码,就必须创建额外的类,这样的话

在某些情况下不如直接用多个类分别继承Thread紧凑。第17页,共22页。18线程的优先级线程的优先级用数字来表示,范围从1到10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORITY。一个线程的缺省优先级是5,即Thread.NORM_PRIORITY。in

tgetPriority();voidsetPriority(intnewPriority);第18页,共22页。19classThreadTest{publicstaticvoidmain(Str

ingargs[]){Threadt1=newMyThread("T1");t1.setPriority(Thread.MIN_PRIORITY);t1.start();Threadt2=newMyThread("T2");t2.setPr

iority(Thread.MAX_PRIORITY);t2.start();Threadt3=newMyThread("T3");t3.setPriority(Thread.MAX_PRIORITY);t3.start();}

}第19页,共22页。20classMyThreadextendsThread{Stringmessage;MyThread(Stringmessage){this.message=message;}publicvoidrun(){

for(inti=0;i<3;i++)System.out.println(message+""+getPriority());}}第20页,共22页。21运行结果:T210T210T210T310T310T310T11T11T11第21页,共2

2页。22注意:并不是在所有系统中运行Java程序时都采用时间片策略调度线程,所以一个线程在空闲时应该主动放弃CPU,以使其他同优先级和低优先级的线程得到执行。第22页,共22页。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?