21天学通java电子第13章多线程_第1页
21天学通java电子第13章多线程_第2页
21天学通java电子第13章多线程_第3页
21天学通java电子第13章多线程_第4页
21天学通java电子第13章多线程_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第13章多线程多线程是Java中的并发机制,表示能够在同一时间内同时执行多个操作。在日常生活中,边上网边听歌就是一个多线程。随着CPU进入双核,甚至多核时代,多线程的优势越来越明显。Java本身就是一门支持多线程的语言,在Java中使用多线程是很方便的,同样也是很高效的。13.1多线程简介在前面的学习中,虽然没有使用多线程,但是同样使用到了线程的知识。在每一个程序中的main方法就是一个线程,它一般被称为主线程。在主线程中可以启动多个子线程来执行。多线程也就是让程序具有多个并发的执行线索,类似于团队协作,多人合作完成一个任务,这样一来就可以大大提高效率,提高资源的利用率。13.2定义线程和创建线程对象上一节讲解了什么是多线程,本节将讲解怎样来定义线程和如何创建线程对象。定义线程有两种方法,一种是继承Thread类,一种是实现Runnable接口,这两种方法存在各自优缺点。和定义线程对应的就是创建线程对象,也有两种方法。在本节中就来学习使用这两种方法来定义线程,以及相对应的创建线程对象的方法。13.2.1继承Thread类定义线程定义一个线程可以通过继承Thread类来实现,继承的类就具有了线程的能力。这是一种相对简单的定义线程的方法。采用这种方式来实现继承最重要的一点就是在定义的线程中需要重写Thread中的润方法。在重写的run方法中,可以定义该线程所要执行的语句。当线程启动时,run方法中的程序就成为一条独立的执行线程。13.2.2实现Runnable接口定义线程定义线程除了通过继承Thread类来实现,还可以通过实现Runnable接口来实现。在Runnable接口中具有一个抽象的run方法,在实现Runnable接口时,需要实现该run方法。该run方法就会作为一个执行线程的方法。对于实现Runnable接口的类,其自身并不是一个线程,只是在该类中通过实现run方法指出了线程所需要完成的任务。13.3运行线程上一节学习了如何定义线程,并且知道了如何创建线程对象。读者对这些都了解后,就需要来学习如何运行线程。本节将分两个部分来讲解,先讲解如何启动线程,然后讲解如何运行多个线程。13.3.1启动线程有些读者会认为启动线程就是调用线程类中的run方法,但这个观点是错误的,在线程创建完成之后,其并不是一个独立执行的线程,而是一个普通的对象,如果要让其成为一个独立的执行线程就必须要进行启动。13.3.2同时运行多个线程如果是两个或者两个以上的线索同时进行,可能前面的例子中就会出现不同的结果,Java中对于线程的启动后可以保证的只是每个线程都启动并且会执行结果,但是这些线程哪些会先执行,哪一些会后执行呢。接下来就来学习如何同时运行多个线程。首先通过示例代码13-6来看一下如何同时运行多个线程。13.4线程生命周期线程是存在生命周期的。线程的生命周期分为5种不同的状态,分别是新建状态、准备状态、运行状态、等待/阻塞状态和死亡状态。本节将对每一个状态进行讲解。13.4.1新建状态当一个线程对象被创建后,线程就处于新建状态。在新建状态中的线程对象从严格意义上看还只是一个普通的对象,它还不是一个独立的线程,不会被线程调度程序调度。处于新建状态中的线程被调用start方法后就会进入准备状态。从新建状态中只能进入准备状态,并且不能从其他状态进行新建状态。新建状态是线程生命周期的第一个状态。13.4.2准备状态处于新建状态中的线程被调用start方法就会进入准备状态,等待被调度执行。处于准备状态下的线程随时都可能被系统选择进入运行状态,从而执行线程。可能同时有多个线程处于准备状态,对于哪一个线程将进入运行状态是不确定的。线程从新建状态进入到准备状态后是不可能再进入新建状态的。在等待/阻塞状态中的线程被解除等待和阻塞后将不直接进入运行状态,而是首先进入准备状态,让系统来选择哪一个线程进入运行状态。13.4.3运行状态处于准备状态中的线程一旦被系统选中,使线程获取了CPU时间,就会进入运行状态。在运行状态中将执行线程类run方法中的程序语句。线程进入运行状态后也不是一下执行结束的,线程在运行状态下随时都可能被调度程序调度回准备状态。在运行状态下还可以让线程进入到等待/阻塞状态。在通常的单核CPU中,在同一时刻只有一个线程处于运行状态的。在多核的CPU中,就可能两个线程或更多的线程同时处于运行状态,这也是多核CPU运行速度快的原因。13.4.4等待/阻塞状态Java中定义了许多线程调度的方法,包括睡眠、阻塞、挂起和等待,这些方法将在后面的调度章节中讲解。使用这些方法都会将处于运行状态的线程调度到等待/阻塞状态。处于等待/阻塞状态的线程被解除后,不会立即回到运行状态,而是首先进入准备状态,等待系统的调度。13.4.5死亡状态当线程中的run方法执行结束后,或者程序发生异常终止运行后,线程会进入死亡状态。处于死亡状态的线程不能再使用start方法启动线程,这在前面的学习中已经学到了这一点。但是这不代表处于死亡状态的线程不能再被使用,它也是可以再被使用的,只是将被作为普通的类来使用。13.5线程的调度通过系统自动调度,线程的执行顺序是没有保障的。Java中定义了一些线程调度的方法,使用这些方法在一定程序上对线程进行调度,使用这些方法只是给线程一个调度的建议,具体是否能够成功,也是没有保障的。线程调度的方法有几个,包括睡眠方法、设置优先级、让步方法等,在本节中就来学习这些方法的使用。13.5.1睡眠方法当线程处于运行状态时,调用sleep睡眠方法将使线程从运行状态进入等待/阻塞状态,从而使程序停止运行。该方法是使正在运行的线程让出CPU的最简单方法之一。sleep睡眠方法是具有一个时间参数的,当经过这么长时间后,线程将进入准备状态,等待系统的调度。从而可以看出,当线程调用睡眠方法后,要想回到运行状态,需要的时间要比指定的睡眠时间长。13.5.2线程优先级在大部分的系统中,对进程的调度都是采用优先级的方式来进行的。在Java中对线程进行调度时,也是可以采用优先级来调度的。不同的线程可以具有不同的优先级,优先级高的线程就会有更大的获得CPU资源的概率,优先级低的线程也并不是总不能被执行,而是在优先级高的线程执行完之后再执行。13.5.3yield让步方法在Java中具有两种线程让步方法,先来介绍第一种yield让步方法。yield让步方法是可以使当前正在运行的线程让出当前CPU,使线程回到准备状态,让其他线程有进入运行状态的机会,而将CPU让给哪一个线程是不确定的,由系统来进行选择。使用yield让步方法的线程将从运行状态进入到准备状态。13.5.4join让步方法使用join让步方法,可以将当前线程的CPU资源让步给指定的线程。当一个线程必须要等待另一个线程执行完毕才可以恢复的时候可以使用join让步方法。13.6综合练习1.判断下面程序是否能够正常运行。【运行结果】使用javac编译程序将产生一个和该程序对应的class程序,然后使用Java运行编译产生的class程序。2.判断下面的程序是否能够正常运行。【运行结果】使用javac编译程序将产生一个和该程序对应的class

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论