书签 分享 收藏 举报 版权申诉 / 48
上传文档赚钱

类型《Java面向对象程序设计(第4版)》课件chapter11 多线程.ppt

  • 上传人(卖家):momomo
  • 文档编号:5787078
  • 上传时间:2023-05-09
  • 格式:PPT
  • 页数:48
  • 大小:461.50KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《《Java面向对象程序设计(第4版)》课件chapter11 多线程.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    Java面向对象程序设计第4版 Java面向对象程序设计第4版课件chapter11 多线程 Java 面向 对象 程序设计 课件 chapter11
    资源描述:

    1、教学目标教学目标11.1线程的概念11.2 线程的状态与生命周期11.3 线程优先级与线程调度策略11.3线程的创建和执行 11.3.1 Thread类和Runnable接口介绍 11.3.2通过继承Thread的子类创建线程 11.3.2 通过实现Runnable 接口创建线程教学目标教学目标11.4 线程同步 11.4.1 Synchonized同步关键字 11.4.2 Wait和Notify方法 11.4.3多线程同步的程序设计举例11.5 Daemon线程 11.6 死锁 11.1 11.1 线程的概念线程的概念nJava语言支持多线程机制n可开发出处理多个任务的功能强大的应用程序。n

    2、并行任务的应用举例1.1.程序、进程与线程的概念程序、进程与线程的概念n 程序是一段静态的代码n 进程是程序一次动态执行的过程.它对应着从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程。进程是由操作系统来管理.n多线程:当需要在一个程序中同时执行几段代码时,以完成不同的任务,就会用多线程技术来实现.多线程由程序负责管理。11.1 11.1 线程的概念线程的概念 n线程是进程中可独立执行的子任务,一个进程可以含有一个或多个线程,每个线程都有一个唯一的标识符。n进程和线程的区别:n进程空间大体分为:进程空间大体分为:数据区,代码区,栈区,数据区,代码区,栈区,

    3、堆区。多个进程的内部数据和状态都是完全独立堆区。多个进程的内部数据和状态都是完全独立的;的;n而线程共享进程的数据区,代码区,堆区,只有而线程共享进程的数据区,代码区,堆区,只有栈区是独立的,所以线程切换比进程切换的代价栈区是独立的,所以线程切换比进程切换的代价小。小。11.1 11.1 线程的概念线程的概念 文件文件输入输出装置输入输出装置各种系统资源各种系统资源数据区段数据区段程序区段程序区段同时有数个地方在执行同时有数个地方在执行一个进程内的单线程一个进程内的单线程一个进程内的多线程的任务一个进程内的多线程的任务文件文件输入输出装置输入输出装置各种系统资源各种系统资源数据区段数据区段程序

    4、区段程序区段只有一个地方在执行只有一个地方在执行11.1 11.1 线程的概念线程的概念 11.2 11.2 线程的状态与生命周期线程的状态与生命周期 n一个线程的生命周期通常要经历五个状态:n创建状态(Born)、n就绪状态或可运行状态(Ready)、n运行状态(Running)、n阻塞状态(Blocked,Waiting,Sleeping)、n死亡状态(Dead)。线程的不同状态以及各状态之间转换的过程。线程的不同状态以及各状态之间转换的过程。R e a d yR u n n in gb lo c k e dS le e p in gW a itin gs t a r tI/o 请 求w

    5、a i tnotifynotifyAll等待时间到期interrupt调 度时 间 片 用 完y i e l ds l e e p执 行 完 毕睡 眠 时 间 到 期i n t e r r u p tB o rn进 入 syn ch ro n ize d 语 句I/O 完成获得 lockinterrupt当 一 个th re a d 执 行 结 束(即 从ru n()方 法 返 回 时),将 到 达 死 亡状 态R e a d yR u n n in gb lo c k e dS le e p in gW a itin gs t a r tI/o 请 求w a i tnotifynotifyA

    6、ll等待时间到期interrupt调 度时 间 片 用 完y i e l ds l e e p执 行 完 毕睡 眠 时 间 到 期i n t e r r u p tB o rn进 入 syn ch ro n ize d 语 句I/O 完成获得 lockinterrupt当 一 个th re a d 执 行 结 束(即 从ru n()方 法 返 回 时),将 到 达 死 亡状 态11.2 11.2 线程的状态与生命周期线程的状态与生命周期1.1.创建状态(创建状态(BornBorn)n Java语言使用Thread类及其子类的对象来表示线程。n当一个Thread类或其子类的对象被创建时,就处于新

    7、建状态。例如,执行下列语句后线程就处于创建状态:Thread myThread=new Thread();11.2 11.2 线程的状态与生命周期线程的状态与生命周期 2.2.就绪状态(就绪状态(ReadyReady,又称作可运行状态可运行状态(R(Runnable )n处于新建状态的线程,通过调用start()方法执行后,就处于就绪状态。n 处于就绪状态的线程,将进入线程队列排队等待分配CPU时间片。n 另外原来处于阻塞状态的线程,被解除阻塞后也将进入就绪状态。例如,执行下列语句后,一个线程就处于就绪状态:Thread myThread=new Thread();myThread.start

    8、();11.2 11.2 线程的状态与生命周期线程的状态与生命周期 3.3.运行状态(运行状态(RunningRunning)n当就绪状态的线程被调度并获得处理器资源时,便进入运行状态。n每一个Thread类及其子类的对象都有一个重要的run()方法。run()方法定义了这一线程的操作功能。n当线程对象被调度执行时,它将自动调用此线程对象的run()方法。n处于运行中的线程,因调用了方法yield()会自动放弃CPU而进入就绪状态。从而使其他就绪的线程有运行的机会。11.2 11.2 线程的状态与生命周期线程的状态与生命周期 4.4.阻塞状态(阻塞状态(BlockedBlocked)n一个正在

    9、运行的线程在某些特殊情况下,如果被人为挂起或需要执行费时的输入输出操作时,将让出CPU并暂时中止自己的执行,进入阻塞状态(包括blocking、waiting和sleeping状态)。n阻塞时它不能进入排队队列。n只有当引起阻塞的原因被消除时,线程才可以转入就绪状态,重新进到线程队列中排队等待CPU资源,以便从原来终止处开始继续运行。11.2 11.2 线程的状态与生命周期线程的状态与生命周期 5.5.死亡状态(死亡状态(DeadDead)n处于死亡状态的线程不具有继续运行的能力。n线程死亡的原因:执行完run()方法体的最后一个语句并退出。11.3 11.3 线程优先级与线程调度策略线程优先

    10、级与线程调度策略 1.1.线程的优先级线程的优先级n每个线程都有一个优先级(每个线程都有一个优先级(prioritypriority),数值范围:),数值范围:110110nThread.MIN_PRIORITYThread.MIN_PRIORITY(常量(常量1 1,最低优先级)最低优先级)nThread.NORM_PRIORITYThread.NORM_PRIORITY(常量值(常量值5,5,默认优先级)默认优先级)nThread.MAX_PRIORITYThread.MAX_PRIORITY(常量(常量10,10,最高优先级)。最高优先级)。n具有较高优先级的线程,完成的任务较紧急,因而

    11、应优先于具有较高优先级的线程,完成的任务较紧急,因而应优先于较低优先级的线程分配处理器时间。较低优先级的线程分配处理器时间。n每个新创建线程均继承创建线程的优先级。每个新创建线程均继承创建线程的优先级。n线程的优先级的设置或读取线程的优先级的设置或读取:n用用ThreadThread对象的方法对象的方法setPriority(int priority)setPriority(int priority);n用用getPriority()getPriority()方法获得线程的优先级。方法获得线程的优先级。11.3 11.3 线程优先级与线程调度策略线程优先级与线程调度策略.线程的调度策略线程的调

    12、度策略n线程调度器(thread scheduler)支持一种抢先式的调度策略:n当前线程执行过程中有较高优先级的线程进入就绪状态,则高优先级的线程立即被调度执行。n而具有相同优先级的所有线程采用轮转的方式,共同分配CPU时间片,这是大多数ava系统支持的分时概念。11.311.3线程的创建和执行线程的创建和执行nJava的线程相关的类在软件包java.langjava.lang中。n在程序中实现多线程有两种方式:n创建Thread类的子类n或实现Runnable接口。n这两种方式都要两个关键性的操作:(1)定义用户线程的操作,即实现线程的run()方法的方法体;(2)构造Thread类对象,

    13、实现线程的建立和运行控制。11.3.1 Thread11.3.1 Thread类和类和RunnableRunnable接口介绍接口介绍 1 1RunnableRunnable接口介绍接口介绍nRunnable接口只有一个方法接口只有一个方法run()n所有实现所有实现Runnable接口的类必须实现这个方法。接口的类必须实现这个方法。它定义了线程体的具体操作。当线程被调度并它定义了线程体的具体操作。当线程被调度并转入运行状态时,它所执行转入运行状态时,它所执行run()方法中规定的方法中规定的操作。操作。2 2ThreadThread类介绍类介绍nThread类是一个具体的类,它封装了一个线程

    14、所类是一个具体的类,它封装了一个线程所需要需要的属性和方法。的属性和方法。nThread类实现类实现Runnable接口中的接口中的run方法方法,但方但方法体为空。法体为空。11.3.1 Thread11.3.1 Thread类和类和RunnableRunnable接口介绍接口介绍3 3ThreadThread类的构造方法类的构造方法n Thread(String threadName)Thread(String threadName)为新创建的线程对象指定一个字符串名称为新创建的线程对象指定一个字符串名称threadNamethreadName。nThread()Thread()线程对象的

    15、名称由系统指定为线程对象的名称由系统指定为“Thread-Thread-”连接一个数值。连接一个数值。如如“Thread-1Thread-1”、“Thread-2Thread-2”n Thread(Runnable target)Thread(Runnable target)以实现以实现RunnableRunnable接口的接口的targettarget对象中所定义的对象中所定义的run()run()方法,方法,来初始化或覆盖新创建的线程对象的来初始化或覆盖新创建的线程对象的run()run()方法。方法。nThread(Runnable target,String ThreadName)Th

    16、read(Runnable target,String ThreadName)nThread(ThreadGroup group,Runnable target,String Thread(ThreadGroup group,Runnable target,String name)name)11.3.1 Thread11.3.1 Thread类和类和RunnableRunnable接口介绍接口介绍n利用构造函数创建新线程对象之后,进入线程的生命周期的第一个状态新建状态。n接着调用线程的start()方法,将启动线程对象n使之从新建状态转入就绪状态并进入就绪队列排队。11.3.1 Thread1

    17、1.3.1 Thread类和类和RunnableRunnable接口介绍接口介绍 4 4ThreadThread类的常用方法类的常用方法(1 1)ThreadThread类的的的静态方法类的的的静态方法nstatic Thread currentThreadstatic Thread currentThread()()返回当前正在运行线程的引用。返回当前正在运行线程的引用。nstatic void yieldstatic void yield()():使当前正在运行的线程暂使当前正在运行的线程暂时中断,变为就绪状态,以让其它线程有运行的机会。时中断,变为就绪状态,以让其它线程有运行的机会。n

    18、static sleep(int)static sleep(int):以以millsecondmillsecond为单位,设置为单位,设置当前线程休眠时间。当前线程休眠时间。sleepsleep要抛出异常,必须捕获。要抛出异常,必须捕获。nstatic sleep(int millsecond,int nanosecond)static sleep(int millsecond,int nanosecond)设置以设置以millsecond(millsecond(毫秒毫秒)+nanosecond()+nanosecond(纳秒纳秒,十亿分之一秒十亿分之一秒)为单位的为单位的休眠时间。休眠时间。

    19、11.3.1 Thread11.3.1 Thread类和类和RunnableRunnable接口介绍接口介绍2 2)ThreadThread类的非静态方法类的非静态方法void start():启动已创建的线程对象void run():由线程调度器调用,当从run()返回时,该进程运行结果。final void setName(String name):设置线程的名字。final String getName():返回线程的名字。interrupt():中断线程对象所处的状态。final boolean isAlive():判断线程是否被启动.void join():使当前线程暂停运行,等调用

    20、jion方法的线程运行结束,当前线程才继续运行。11.3.2 11.3.2 从从ThreadThread的派生子类创建线程的派生子类创建线程n创建用户定制的Thread类的子类,并在子类中重新定义自己的run()方法,这个run()方法中包含了用户线程的操作。11.3.211.3.2通过继承通过继承ThreadThread的子类创建线程的子类创建线程n例例11-1 11-1 通过定制的通过定制的ThreadThread的子类,创建多线程。的子类,创建多线程。该程序是一个Application程序,主线程是main()方法执行的路线。在主线程中创建三个线程,其名称是thread1、thread2

    21、和thread3,每个线程的优先级均为默认的Thread.NORM_PRIORITY。每个线程启动后,由系统执行run()方法,运行将显示信息:进入睡眠的线程名称和要休眠的时间.。程序运行输出结果如图11-3 public class ThreadTester public static void main(String args)/创建和命名三个线程创建和命名三个线程 PrintThread thread1=new PrintThread(thread1);PrintThread thread2=new PrintThread(thread2);PrintThread thread3=new

    22、 PrintThread(thread3);System.err.println(主线程将要启动三个线程主线程将要启动三个线程);thread1.start();/启动启动thread1,进入就绪状态,进入就绪状态 thread2.start();/启动启动thread2,进入就绪状态,进入就绪状态 thread3.start();/启动启动thread3,进入就绪状态,进入就绪状态 System.err.println(三个线程启动完成三个线程启动完成,主线程运行结束主线程运行结束n);class PrintThread extends Thread private int sleepTim

    23、e;public PrintThread(String name)super(name);/通过调用父类构造方法给 thread 命名 sleepTime=(int)(Math.random()*5001);/设置睡眠时间0到5 秒 public void run()/设置线程运行的线程体 try System.err.println(getName()+进入睡眠状态,睡眠时间是:+sleepTime);Thread.sleep(sleepTime);catch(InterruptedException exception)System.err.println(getName()+睡眠醒来);

    24、/显示线程名称 11.3.2 11.3.2 实现实现Runnable Runnable 接口创建线程接口创建线程n通过实现Runnable 接口创建线程的步骤:1.创建实现Runnable接口的类,在此类中实现Runnable接口中run()方法;2.创建此类的对象,并将此对象作为参数传递给 Thread类的构造方法,构造Thread对象并启动它。n只要一段代码在单独线程中运行,则可以继承Runnable接口,并将该段代码放在该接口run()方法中。11.3.2 11.3.2 实现实现Runnable Runnable 接口接口,创建线程创建线程n例例11-2 11-2 通过实现通过实现Run

    25、nableRunnable接口创建线程接口创建线程n程序是一个Applet:实现一个时钟功能,时钟数据每隔1秒就变化一次。程序通过每隔1秒执行线程的刷新画面功能,显示当前时间。11.3.2 11.3.2 实现实现Runnable Runnable 接口接口,创建线程创建线程n类Clock继承了JApplet,并实现接口Runnable。n在JApplet的init方法中创建时钟线程对象并启动它;n在时钟线程对象启动后,运行run()方法;n在run()方法中,安排时钟线程睡眠1秒钟,1秒钟到期时,调用repaint()方法,以间接调用paint()方法,用以在Applet图形界面显示当前时间;

    26、n在用户关闭页面时通过调用interrupt()方法,中断时钟线程睡眠状态,从run方法返回,时钟线程运行结束。public void paint(Graphics g)/JApplet的方法paint,显示当前时钟对象的值 super.paint(g);SimpleDateFormat formatter=new SimpleDateFormat(hh:mm:ss,Locale.getDefault();Date currentDate=new Date();String lastdate=formatter.format(currentDate);g.drawString(lastdate

    27、,5,10);public void destroy()/JApplet的方法 clockThread.interrupt();11.4 11.4 线程同步线程同步 n多个同时运行的线程之间的通信,往往需要通过共享数据块去完成。n共享数据的读写操作往往封装在一个对象中,此对象称为共享对象。这样,多个同时运行的线程往往需要操作同一个共享的对象。n多个线程同时访问共享对象:n有些线程读取共享对象,同时又有一个以上的线程修改这个共享对象,此时如果对共享对象不能有效地管理,则不能保证共享对象的正确性。class bank static double balance;public boolean get

    28、(double amount)/取钱取钱 if(balance=amount)balance-=amount;return true;else return false;public set(double amount)/存钱存钱 balance+=amount;线程线程 3存钱存钱 线程线程1取钱取钱线程线程2取钱取钱透支透支余额余额class bank static double balance;synchonizedsynchonized public boolean get(double amount)/取钱取钱 synchonized synchonized public set(d

    29、ouble amount)/存钱存钱 11.4 11.4 线程同步线程同步11.4.1 Synchonized11.4.1 Synchonized同步关键字同步关键字 n为了保证共享对象的正确性,Java语言中,使用关键字synchonized修饰对象的同步语句或同步方法。synchonized的一般使用格式有:synchonized(对象)或 synchonized 方法声明头 定义对象的同步代码块定义对象的同步方法一个对象上可定义多个同步语句或同步方法。一个对象上可定义多个同步语句或同步方法。11.4.1 Synchonized11.4.1 Synchonized同步关键字同步关键字n一个

    30、对象上可定义多个同步语句或同步方法。一个对象上可定义多个同步语句或同步方法。nJavaJava系统只允许一个线程系统只允许一个线程,执行对象的一个同步语句或一执行对象的一个同步语句或一个同步方法。个同步方法。n一个线程在进入同步语句或同步方法时要给对象加互斥锁(获得锁),一个对象只能加一把互斥锁,加锁成功时才能执行同步语句;n而其它所有试图对同一个对象执行同步语句的线程,因加锁不成功都将处于阻塞状态。n在同步语句或同步方法完成执行时,同步对象上的锁被解除,并让最高优先级的阻塞线程处理它的同步语句。n一个对象中的所有一个对象中的所有synchronizedsynchronized方法都共享一把锁

    31、,这方法都共享一把锁,这把锁能够防止多个方法对把锁能够防止多个方法对共共用内存同时进行的写操作。用内存同时进行的写操作。11.4.2 Wait和Notify方法n在线程获得对象的锁情形下,如果该线程确定只有在一些条件下满足的情况下,才能继续对该对象执行线程任务,这时该线程可调用Object类的wait()方法。n线程调用wait方法会解除对象的锁,并使该线程处于等待状态,让出CPU资源,使其它线程将尝试执行该对象的同步语句。n在某个线程执行完同步语句,或该线程使另一个线程所等待的条件满足时,它将调用Object类的notify()方法,以允许一个处于等待状态的线程再次进入就绪状态。这时,从等待

    32、状态进入就绪状态的线程,将再次尝试获得该对象的锁。nObject类的notifyAll()方法将使因该对象处于等待状态的全部线程进入就绪状态。n注意:wait方法和notify方法一般配合使用。wait()和sleep()的区别:wait()方法被调用时会解除锁定,但使用它的地方只是在一个同步的方法或代码块内。11.4.3 多线程同步的程序设计举例n例例11-3:11-3:以生产者和消费者的关系模型,说明如何应用Java同步机制进行多线程的程序设计。生产者线程生产者线程消费者线程消费者线程共享对象共享对象putget 若共享对象中只能存放一个数据,可能出现以下问题:生产者比消费者快时,消费者会

    33、漏掉一些数据没有生产者比消费者快时,消费者会漏掉一些数据没有取到;取到;消费者比生产者快时,消费者取相同的数据。消费者比生产者快时,消费者取相同的数据。11.4.3 多线程同步的程序设计举例n程序假设共享缓冲区只用一个整型数据。int buffern生产者线程生产的数据在放入共享缓冲区时,要检查缓冲区是否空,n若空,则将数据写入缓冲区,并调用notify方法使处于等待状态的消费者线程转为就绪状态;n若不空,则调用wait方法使自己等待。n消费者线程在从共享缓冲区读数据时,应检查缓冲区是否已有数据存在,n若有数据存在,则从缓冲区读数据,并调用notify方法使处于等待状态的生产者线程转为就绪状态

    34、;n若无数据存在,则调用wait方法使自己等待。n程序使用条件变量occupiedBufferCount控制缓冲区buffers读写,当occupiedBufferCount为0时,可写但不能读,当occupiedBufferCount为1时,可读但不能写。11.4.3 多线程同步的程序设计举例n程序由四个源文件组成:nBuffer.java定义了共享缓冲区的读写管理类;nProducer.java定义了生产者类;nConsumer.java定义了Consumer类;nSharedBufferTest.java定义了测试类.在main方法中,创建了一个生产者线程和一个消费者线程,并分别启动了它

    35、们。n程序运行的输出结果:public class Buffer private int buffer=-1;/buffer缓冲区被缓冲区被producer 和和 consumer 线程共享线程共享 private int occupiedBufferCount=0;/控制缓冲区控制缓冲区buffers读写的条件边量读写的条件边量 public synchronized void set(int value)/place value into buffer String name=Thread.currentThread().getName();/get name of thread that

    36、 called this method while(occupiedBufferCount=1)/while there are no empty locations,place thread in waiting state try wait();catch(InterruptedException exception)/if waiting thread interrupted,print stack trace exception.printStackTrace();/end while buffer=value;/set new buffer value +occupiedBuffer

    37、Count;System.err.println(name+writes +buffer);notify();/tell waiting thread to enter ready state /end method set;releases lock on SynchronizedBuffer public synchronized int get()/return value from buffer String name=Thread.currentThread().getName();while(occupiedBufferCount=0)/while no data to read,

    38、place thread in waiting state try wait();catch(InterruptedException exception)exception.printStackTrace();/end while /indicate that producer can store another value,because consumer just retrieved buffer value -occupiedBufferCount;System.err.println(name+reads +buffer);notify();/tell waiting thread

    39、to become ready to execute return buffer;/end method get;releases lock on SynchronizedBuffer /SharedBufferTest2.javapublic class SharedBufferTest public static void main(String args)Buffer sharedLocation=new Buffer();Producer producer=new Producer(sharedLocation);Consumer consumer=new Consumer(share

    40、dLocation);producer.start();/start producer thread consumer.start();/start consumer thread /end main /end class SharedBufferTest2public synchronized int get()/return value from buffer String name=Thread.currentThread().getName();while(occupiedBufferCount=0)/while no data to read,place thread in wait

    41、ing state try wait();catch(InterruptedException exception)exception.printStackTrace();/end while /indicate that producer can store another value,because consumer just retrieved buffer value -occupiedBufferCount;System.err.println(name+reads +buffer);notify();/tell waiting thread to become ready to e

    42、xecute return buffer;/end method get;releases lock on SynchronizedBuffer /Producer.javapublic class Producer extends Thread private Buffer sharedLocation;/引用指向共享对象引用指向共享对象 public Producer(Buffer shared)super(Producer);sharedLocation=shared;/将值将值 1 到到4 存放到存放到sharedLocation public void run()for(int co

    43、unt=1;count=4;count+)sharedLocation.set(count);System.err.println(getName()+done producing.+Terminating );/end method run/end class Producer public synchronized int get()/return value from buffer String name=Thread.currentThread().getName();while(occupiedBufferCount=0)/while no data to read,place th

    44、read in waiting state try wait();catch(InterruptedException exception)exception.printStackTrace();/end while /indicate that producer can store another value,because consumer just retrieved buffer value -occupiedBufferCount;System.err.println(name+reads +buffer);notify();/tell waiting thread to becom

    45、e ready to execute return buffer;/end method get;releases lock on SynchronizedBuffer /Consumer.javapublic class Consumer extends Thread private Buffer sharedLocation;/引用指向共享对象引用指向共享对象 public Consumer(Buffer shared)super(Consumer);sharedLocation=shared;/从从 sharedLocation读取值四次并累加到读取值四次并累加到sum public v

    46、oid run()int sum=0;for(int count=1;count=4;count+)sum+=sharedLocation.get();System.err.println(getName()+read values totaling:+sum+and Terminating );/SharedBufferTest2.javapublic class SharedBufferTest public static void main(String args)Buffer sharedLocation=new Buffer();Producer producer=new Produ

    47、cer(sharedLocation);Consumer consumer=new Consumer(sharedLocation);producer.start();/start producer thread consumer.start();/start consumer thread /end main /end class SharedBufferTest211.5 Daemon 11.5 Daemon(守护守护)线程线程 nDaemon线程是为其它线程提供服务的线程,它的优先级是最低的。n典型的守护线程例子是JVM中的系统资源自动回收线程n它始终在低级别的状态中运行,用于实时监控和

    48、管理系统中的可回收资源。n当系统中运行的只有Daemon线程,则系统会自动清除Daemon线程,退出Java解释器。n守护线程与非守护线程(用户线程)的区别:一旦所有非Daemon线程完成,程序会中止运行。相反,假若有任何非Daemon线程仍在运行,则程序的运行不会中止。n设置一个线程为守护线程的方式:在线程对象启动之前调用线程对象的方法:public final void setDaemon(boolean on)11.5 Daemon 11.5 Daemon(守护守护)线程线程n设置一个线程为守护线程的方式:在线程对象启动之前调用线程对象的方法:public final void setD

    49、aemon(boolean on)n判断一个线程是否是 Daemon线程:final boolean isDaemon()11.6 11.6 死锁死锁 n多线程在使用互斥机制实现同步的同时不仅会带来阻塞,还会带来“死锁”(deadlock)的潜在危险。触发死锁的发生的例子:线程A锁住了线程B等待的资源,而且线程B锁住了线程A等待的资源,即线程B一直在等待线程A释放锁,线程A也是如此。n如果你的持有一个锁并试图获取另一个锁时,就有死锁的危险。线程线程2pen线程线程1note把把“pen”给我给我,我我才能给你才能给你“note”把把“note”给我给我,我我才能给你才能给你“pen”11.6

    50、11.6 死锁死锁nJava技术即不能发现死锁也不能避免死锁。n程序员多线程编程时,应注意死锁问题,尽量避免。n防止死锁的方法:n对竞争的资源引入序号,如果一个线程需要几个资源,那么它必须先得到小序号的资源,再申请大序号的资源。n在程序中不提倡使用线程的停止/销毁线程的方法stop()的/destroy(),挂起/恢复线程的方法suspend()/resume()线程线程1note:1pen:2线程线程211.7 11.7 小结小结 nJava的线程概念n线程的生命周期包含五个状态:创建状态(Born)、就绪状态(Ready)、运行状态(Running)、阻塞状态(Blocked,Waitin

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:《Java面向对象程序设计(第4版)》课件chapter11 多线程.ppt
    链接地址:https://www.163wenku.com/p-5787078.html
    momomo
         内容提供者      个人认证 实名认证

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库