欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    进程与线程 (2)优秀课件.ppt

    • 资源ID:65051069       资源大小:1.71MB        全文页数:30页
    • 资源格式: PPT        下载积分:18金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要18金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    进程与线程 (2)优秀课件.ppt

    进程与线程第1页,本讲稿共30页本章内容进程与线程的概念创建子进程线程创建与启动线程组定时器TimerTask线程状态转换线程的交互线程的调度线程同步并发协作-死锁线程池“生产者-消费者-仓储”模型第2页,本讲稿共30页进程和线程现在的操作系统是多任务的,多线程是实现多任务的一种方式。进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。线程是进程中的执行分支,一个进程可以运行多个线程。进程中的多个线程共享进程的内存。由于CPU执行速度非常快,给人以多个进程“同时”执行的感觉,实际上线程之间是轮换执行的。第3页,本讲稿共30页创建子进程通过Java代码启动多个Java子进程,虽然占用一些系统资源,但会使程序更加稳定,因为新启动的程序是在不同的虚拟机进程中运行的,如果有一个进程发生异常,并不影响其它的子进程。使用Runtime调用子进程程序。使用ProcessBuilder建立子进程。第4页,本讲稿共30页创建线程线程的创建有两种方式:第一种:扩展java.lang.Thread类。第二种:实现java.lang.Runnable接口。重写run()方法。第5页,本讲稿共30页实例化线程如果是扩展如果是扩展java.lang.Threadjava.lang.Thread类的线程,则直接类的线程,则直接newnew即即可。可。如果是实现了如果是实现了java.lang.Runnablejava.lang.Runnable接口的类,则调用接口的类,则调用ThreadThread的构造方法:的构造方法:Thread(Runnable target)Thread(Runnable target)Thread(Runnable target,String name)Thread(Runnable target,String name)Thread(ThreadGroup group,Runnable target)Thread(ThreadGroup group,Runnable target)Thread(ThreadGroup group,Runnable target,Thread(ThreadGroup group,Runnable target,String name)String name)Thread(ThreadGroup group,Runnable target,String Thread(ThreadGroup group,Runnable target,String name,long stackSize)name,long stackSize)分配新的分配新的 Thread Thread 对象,以便将对象,以便将 target target 作为其运行对作为其运行对象,将指定的象,将指定的 name name 作为其名称,作为作为其名称,作为 group group 所引用所引用的线程组的一员,并具有指定的堆栈尺寸。的线程组的一员,并具有指定的堆栈尺寸。第6页,本讲稿共30页启动线程在线程的Thread对象上调用start()方法,而不要直接调用run()或者别的方法。在调用start()方法之后,发生了一系列动作:1、启动新的执行线程(具有新的调用栈);2、该线程从新状态转移到可运行状态;3、当该线程获得机会执行时,其目标run()方法将运行。注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。第7页,本讲稿共30页关于线程创建和启动的问题运行中的线程总是有名字的,名字有两个来源,一个是虚拟机自己给的名字,一个是你自己的定的名字。在没有指定线程名字的情况下,虚拟机总会为线程指定名字,并且主线程的名字总是mian,非主线程的名字不确定。线程都可以设置名字,也可以获取线程的名字,连主线程也不例外。获取当前线程的对象的方法是:Thread.currentThread()。一系列线程以某种顺序启动并不意味着将按该顺序执行。对于任何一组启动的线程来说,调度程序不能保证其执行次序,持续时间也无法保证。第8页,本讲稿共30页当线程目标run()方法结束时该线程完成。一旦线程启动,它就永远不能再重新启动。只有一个新的线程可以被启动,并且只能一次。一个可运行的线程或死线程可以被重新启动。线程的调度是JVM的一部分,在一个CPU的机器上上,实际上一次只能运行一个线程。一次只有一个线程栈执行。JVM线程调度程序决定实际运行哪个处于可运行状态的线程。尽管是采用队列形式,事实上,把它称为可运行池而不是可运行队列。尽管我们没有无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。第9页,本讲稿共30页线程状态转换图第10页,本讲稿共30页关于线程状态转换的几点说明新状态:线程对象已经创建,还没有在其上调用start()方法。可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。第11页,本讲稿共30页定时器TimerTaskTimerTask是一种特殊的线程,用来为Timer安排一次执行或重复执行的任务。它实现了Runnable接口,是一个抽象类:public abstract class TimerTask implements RunnableTimerTask本身没有实现run()方法,需要子类来实现它。定时器任务与线程不同,它是定时执行的线程,因此不能够直接使用start()来启动它,而需要使用一个特殊的类Timer来启动它。Timer是一种工具,用来安排在后台线程中执行的任务。第12页,本讲稿共30页阻止线程执行的三个因素IO阻塞睡眠等待IO阻塞是由于线程等待输入输出而交出CPU时间处于等待状态。在此暂不讨论IO阻塞的情况。第13页,本讲稿共30页睡眠Thread.sleep(long millis)和Thread.sleep(long millis,int nanos)静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。当线程睡眠时,它入睡在某个地方,在苏醒之前不会返回到可运行状态。当睡眠时间到期,则返回到可运行状态。线程睡眠的原因:线程执行太快,或者需要强制进入下一轮,因为Java规范不保证合理的轮换。睡眠的实现,调用静态方法:Thread.sleep(100);/睡眠100毫秒第14页,本讲稿共30页关于睡眠的几点说明线程睡眠是帮助所有线程获得运行机会的最好方法。线程睡眠到期自动苏醒,并返回到可运行状态,不是运行状态。sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始执行。sleep()是静态方法,只能控制当前正在运行的线程。第15页,本讲稿共30页线程优先级线程总是存在优先级,优先级范围在110之间。JVM线程调度程序是基于优先级的抢先调度机制。在大多数情况下,当前运行的线程优先级将大于或等于线程池中任何线程的优先级。但这仅仅是大多数情况。当设计多线程应用程序的时候,一定不要依赖于线程的优先级。因为线程调度优先级操作是没有保障的,只能把线程优先级作用作为一种提高程序效率的方法,但是要保证程序不依赖这种操作。第16页,本讲稿共30页设置线程优先级线程默认的优先级是创建它的执行线程的优先级。可以通过setPriority(int n)更改线程的优先级。例如:Thread t=new MyThread();t.setPriority(8);t.start();线程优先级为110之间的正整数,JVM从不会改变一个线程的优先级。然而,110之间的值是没有保证的。一些JVM可能不能识别10个不同的值,而将这些优先级进行每两个或多个合并,变成少于10个的优先级,则两个或多个优先级的线程可能被映射为一个优先级。第17页,本讲稿共30页线程优先级的默认值线程默认优先级是5,Thread类中有三个常量,定义线程优先级范围:static int MAX_PRIORITY 线程可以具有的最高优先级。static int MIN_PRIORITY 线程可以具有的最低优先级。static int NORM_PRIORITY 分配给线程的默认优先级。第18页,本讲稿共30页静态方法yield()Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。第19页,本讲稿共30页非静态方法join()Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。例如:Thread t=new MyThread();t.start();t.join();另外,join()方法还有带超时限制的重载版本。例如t.join(5000);则让线程等待5000毫秒,如果超过这个时间,则停止等待,变为可运行状态。第20页,本讲稿共30页守护线程守护线程与普通线程写法上没有区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。setDaemon方法的详细说明:public final void setDaemon(boolean on)将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。该方法必须在启动线程前调用。该方法首先调用该线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException(在当前线程中)。第21页,本讲稿共30页线程状态转换知识小结调用Thread.sleep():使当前线程睡眠至少多少毫秒(尽管它可能在指定的时间之前被中断)。调用Thread.yield():不能保障太多事情,尽管通常它会让当前运行线程回到可运行性状态,使得有相同优先级的线程有机会执行。调用join()方法:保证当前线程停止执行,直到该线程所加入的线程完成为止。如果它加入的线程没有存活,则当前线程不需要停止。第22页,本讲稿共30页线程离开运行状态的几个原因除了以上三种方式外,还有下面几种特殊情况可能使线程离开运行状态:1、线程的run()方法完成。2、在对象上调用wait()方法(不是在线程上)。3、线程不能在对象上获得锁定,它正试图运行该对象的方法代码。4、线程调度程序可以决定将当前运行状态移动到可运行状态,以便让另一个线程获得运行机会,而不需要任何理由。第23页,本讲稿共30页线程同步线程的同步是保证多线程安全访问竞争资源的一种手段。对于同步,在具体的Java代码中需要完成一下两个操作:把竞争访问的资源标识为private;同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。第24页,本讲稿共30页并发协作-死锁发生死锁的原因一般是两个对象的锁相互等待造成的。public int read()synchronized(resourceA)System.out.println(read():+Thread.currentThread().getName()+获取了resourceA的锁!);synchronized(resourceB)System.out.println(read():+Thread.currentThread().getName()+获取了resourceB的锁!);return resourceB.value+resourceA.value;public void write(int a,int b)synchronized(resourceB)System.out.println(write():+Thread.currentThread().getName()+获取了resourceA的锁!);synchronized(resourceA)System.out.println(write():+Thread.currentThread().getName()+获取了resourceB的锁!);resourceA.value=a;resourceB.value=b;第25页,本讲稿共30页线程池线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。Java5的线程池分好多种:固定尺寸的线程池、单任务线程池、可变尺寸线程池、延迟线程池、单任务延迟线程池。第26页,本讲稿共30页固定大小的线程池固定大小的线程池可以满足绝大多数的程序需求,是最常用也是最容易理解的。固定大小的线程池原理是:定义一个线程池,其容纳线程的个数是固定的,当加入的线程数小于这个值时,可以直接使用而无需创建新的线程,节省了创建新线程的系统开支,拥有更快的响应速度。当其实线程数大于线程池容量时,会让后来的线程处于等待状态。创建一个可重用固定线程数的线程池:ExecutorService pool=Executors.newFixedThreadPool(10);pool.execute(t1);pool.execute(t2);pool.shutdown();第27页,本讲稿共30页延迟线程池创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行:ScheduledExecutorService pool=Executors.newScheduledThreadPool(2);/将线程放入池中进行执行pool.execute(t1);pool.execute(t2);pool.execute(t3);/使用延迟执行风格的方法 pool.schedule(t4,10,TimeUtil.MICROSECONDS);pool.schedule(t5,10,TimeUtil.MICROSECONDS);/关闭线程池 pool.shutdown();第28页,本讲稿共30页示例:“生产者-消费者-仓储”模型对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。实际上,准确说应该是“生产者-消费者-仓储”模型。对于此模型,应该明确一下几点:1、生产者仅仅在仓储未满时候生产,仓满则停止生产。2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。3、当消费者发现仓储没产品可消费时候会通知生产者生产。4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。此模型将要结合Object的wait与notify、notifyAll方法来实现。第29页,本讲稿共30页课后练习写一个Java程序1,在里面创建新文件,并往文件中写入一个字符串。然后在另一个Java程序2中,以调用子进程的方式调用程序1。创建两个交替运行的线程。利用线程写一个存取款应用程序。存款人:爸爸、妈妈、爷爷取款人:老大、老二、老三中间人:银行卡爸爸每次存1500,妈妈每次存1200,爷爷每次存800,取款人每次取600。银行卡存款上限为5000,也就是达到或超过5000元时不再存款。第30页,本讲稿共30页

    注意事项

    本文(进程与线程 (2)优秀课件.ppt)为本站会员(石***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开