第11章 多线程编程(pp28,68).ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章 多线程编程(pp28,68)

第1部分 Java语言 第11章 多线程编程 Java内置支持多线程编程。 多线程程序包含两条或两条以上并发运行的部分。 多线程是多任务处理的一种特殊形式。 多任务处理有两种类型:基于进程和基于线程。。 进程(process)是一个执行的程序。程序是调度程序所分派的最小代码单位。 进程是重量级的任务,需要分配自己独立的地址空间。 进程间通信是昂贵和受限的。进程间的转换是高成本的。 线程(thread)的多任务处理环境中,线程是最小的执行单位。 线程是轻量级的任务。 线程共享相同的地址空间且共同分享同一个进程。 线程间通信是便宜的,线程间的转换是低成本的。 因为空闲时间保持最低,多线程最大利用CPU。 11.1 Java线程模型 单线程处理使用一种轮询的事件循环方法。 单线程在一无限循环中运行,轮询一个事件序列来决定下一步做什么。 直到事件处理程序返回,系统中没有其他事件发生。这就浪费了CPU时间。 单线程环境,当一个线程因为等待资源时阻塞,整个程序停止运行。 多线程的优点在于取消了主循环/轮询机制。 一个线程可以暂停而不影响程序的其他部分。 多线程允许活的循环在每一帧间隙中沉睡一秒而不暂停整个系统。 在Java程序中出现线程阻塞,仅有一个线程暂停,其他线程继续运行。 线程状态:运行、挂起、恢复、阻塞、终止。 11.1.1 线程优先级 Java给每个线程安排优先级以决定与其他线程比较时该如何对待该线程。 优先级高的线程并不比优先权低的线程运行的快。 线程的优先级是用来决定何时从一个运行的线程切换到另一个。 线程可以自动放弃控制(I/O未定、睡眠或明确让步的阻塞),所有其他的线程被检测,准备运行的最高优先级线程。 线程可被高优先级的线程抢占。低优先级线程不主动放弃,处理器被高优先级的线程占据。高优先级线程要运行,它就执行。这叫做有优先权的多任务处理。 当两个相同优先级的线程竞争CPU周期时:循环模式下自动划分时间;对等体自动放弃。 11.1.2 同步性 多线程在程序中引入了异步行为,所以必须要加强同步性。 Java在进程间同步性方法:管程(monitor)。 一旦线程进入管程,所有线程必须等待直到该线程退出了管程。管程可以用来防止共享的资源被多个线程操纵。 Java没有“Monitor”类:当对象的同步方法被调用时管程自动载入隐式管程。 一个线程包含在一个同步方法中,没有其他线程可以调用相同对象的同步方法。 11.1.3 消息传递 程序分成若干线程后,就要定义各线程之间的联系。 Java提供了多线程间会话的简洁、低成本途径——通过调用所有对象都有的预先确定的方法。 Java的消息传递系统允许一个线程进入一个对象的一个同步方法,然后在那里等待,直到其他线程明确通知它。 11.1.4 Thread 类和Runnable 接口 为创建一个新的线程,你的程序必须扩展Thread 或实现Runnable接口。 管理线程的方法 方法 意义 getName 获得线程名称 getPriority 获得线程优先级 jsAlive 判定线程是否仍在运行 join 等待一个线程终止 run 线程的入口点. sleep 在一段时间内挂起线程 start 通过调用运行方法来启动线程 11.2 主线程 当Java程序启动时,一个线程立刻运行,该线程通常叫做程序的主线程(main thread)。 它是产生其他子线程的线程。 它必须最后完成执行(因为它执行各种关闭动作)。 主线程可以由一个Thread对象控制。 调用方法currentThread()获得它的一个引用: static Thread currentThread( ) // 返回一个调用它的线程的引用 例P194 调用currentThread() // Controlling the main Thread. class CurrentThreadDemo { public static void main(String args[]) { Thread t = Thread.currentThread(); System.out.println(Current thread: + t); // change the name of the thread t.setName(My Thread); //改变线程的内部名称

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档