内蒙古财经大学计算机信息管理学院面向对象程序设计课件 多线程(2).ppt

内蒙古财经大学计算机信息管理学院面向对象程序设计课件 多线程(2).ppt

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java的多线程 线程的调度 线程的状态 Newborn:线程已创建,但尚未执行 Runnable:(就绪) 线程已被调度,按优先级和先到先服务原则在 队列中排队等待CPU时间片资源 Runnnig:正在运行 Blocked:(阻塞) 因某事件或睡眠而被暂时性地挂起 Dead:正常/强行中断,退出运行状态 线程的优先级 JAVA支持抢占式线程调度 优先级高的线程不必等待当前时间片的结束而 直接抢到处理器控制权。 Thread类有三个有关线程优先级的静态常量: MIN_PRIORITY=1(最低)、 MAX_PRIORITY=10(最高)、 NORM_PRIORITY默认值为5(一般)。 例:TestThreadPriority.java 对线程的基本控制 1、结束线程:stop()方法。 例:ThreadTerminateByFlag 2、设定线程的优先级:setPriority(int priority) 3、暂时阻止线程的执行 (1)sleep()方法:用来挂起线程的执行。 对线程的基本控制 try{Thread.sleep(long millisecond)} catch(InterruptedException e){…..} (2)join()方法。 例:TreadJion.java (3)yeild()方法。 4.其它常用的方法 isAlive() :判断线程目前是否正在执行状态中 resume():要求被暂停得线程继续执行 suspend():暂停线程的执行 线程的同步与共享 有时一些运行的线程需要共享数据,例如一个线程向文件写数据,而同时另一个线程从同一个文件读取数据,因此就必须考虑其他线程的状态与行为,这时就需要实现同步来得到预期的结果。 例:Syncounter1两线程共享同一资源 多线程问题---资源协调 1. 数据的完整性 对共享对象的访问必须同步,叫做条件变量. Java语言允许通过监视器(有的参考书称其为管程)使用条件变量实现线程同步. 监视器阻止两个线程同时访问同一个条件变量.它的如同锁一样作用在数据上. 线程1进入withdrawal方法时,获得监视器(加锁);当线程1的方法执行完毕返回时,释放监视器(开锁),线程2的withdrawal方能进入. 用synchronized来标识的区域或方法即为监视器监视的部分。 一个类或一个对象由一个监视器,如果一个程序内有两个方法使用synchronized标志,则他们在一个监视器管理之下. 一般情况下,只在方法的层次上使用关键区 线程的同步与共享 例: Syncounter2将Syncounter1中的increase()和testEquals()设为synchronized方法。 线程之间的同步控制 例如:生产者-消费者问题 分析:在这个例子中,生产者与消费者通过CubbyHole对 象来共享数据。但不论生产者线程还是消费者线程都无 法保证生产者每产生一个数据,消费者就能及时取得该 数据并且只取一次。通过CubbyHole中的put()和get()方 法只能保证较低层次的同步。 1、生产者比消费者快,在消费者来不及取前一个数据之 前,生产者又产生了新的数据。 2、当消费者比生产者快时,消费者可能两次取同一个数据。 线程之间的同步控制 这种异步执行的多线程,由于希望同时进入同一个对象中而发生错误结果的情况称为竞争条件。 为避免竞争情况的发生,就必须使生产者线程向CubbyHole中存储数据和消费者线程从CubbyHole中取数据同步起来。 像CubbyHole这样被多个线程互斥共享的对象我们称为互斥数据(互斥区);java正是通过设立互斥锁实现同步的。一段特定时间内只能有一个线程获得互斥锁,而其他线程将被暂停直到当前线程释放互斥锁。 例: CubbyHole类的改造 线程之间的同步控制 Wait()方法是java.lang.Object类为线程提供用于实现线程间通信的同步控制方法.wait()方法使当前线程主动释放互斥锁,并进入互斥锁的等待序列。(它使当前线程暂停执行,等待其他线程执行notify()方法或notifyAll()方法后继续执行本线程)。本方法用于释放一个项目的线程唤醒另一个当前可能等待的线程。 线程之间的同步控制 例题分析: 类CubbyHole有两个变量:seq是CubbyHole中当前内容,布尔变量available指示当前内容是否可以取出。只有当available为true时,消费者才能取数据。为实现两进程同步,必须保证: 1、消费者接收数据的前提是available为true。即数据单元内容不空。 2、生产者发送数据的前提是数据单元内容为空。 本例题中通过调用notify

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档