Java课件的第八章.ppt

  1. 1、本文档共66页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
由输出结果,我们可以看到生产者和消费者两个线程实现了同步。 思考题: ①线程是什么?与进程的区别? ②创建线程对象的方法有哪些? ③线程有哪些状态,画出状态转换图。 ④线程的同步与共享 监视器解决什么问题? nofity和wait解决什么问题? 会编写Product-Consumer程序吗? 试验 实验名称:多线程 实验目的: 了解多线程概念 熟悉多线程编程 实验任务: 设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况。 实验要求: 要求打印出每个售票点所卖出的票号 各售票点不能售出相同票号的火车票 3)尤其关键的是,当一个线程访问object的一 个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。 num对象 Counter1 Counter2 num对象 Counter1 Counter2 锁 我们把系统中使用某类资源的线程称为消费者,产生或释放同类资源的线程称为生产者。 下面我们来讨论关于线程的同步问题的一般模型。 即生产者-消费者问题。 二、线程间的同步控制 生产者-消费者问题 在一个Java的应用程序中,生产者线程向文件中写数据,消费者从文件中读数据,这样,在这个程序中同时运行的两个线程共享同一个文件资源。 通过这个例子我们来了解怎样使它们同步。 生产者-消费者 在这个例子中,生产者产生从0到9的整数,将它们存储在名为"CubbyHole"的对象中并打印出这些数来。然后调用sleep()方法使生产者线程在一个随机产生的0到100秒的时间段内休息。 class Producer extends Thread { private CubbyHole cubbyhole; private int number;   public Producer(CubbyHole c, int number) { cubbyhole = c; this.number = number; } public void run() { for (int i = 0; i 10; i++) { cubbyhole.put(i); System.out.println(Producer # + this.number + put: + i); try { sleep((int)(Math.random() * 100)); } catch (InterruptedException e) { } } } } 消费者线程则不断地从CubbyHole对象中取这些整数: class Consumer extends Thread { private CubbyHole cubbyhole; private int number;   public Consumer(CubbyHole c, int number) { cubbyhole = c; this.number = number; }   public void run() { int value = 0; for (int i = 0; i 10; i++) { value = cubbyhole.get(); System.out.println(Consumer # + this.number + got: + value); } } } class CubbyHole { private int seq; public synchronized int get() { return seq; } public synchronized void put(int value) { seq = value; } } 生产者与消费者通过CubbyHole对象来共享数据。 但我们发现不论是生产者线程还是消费者线程都无法保证生产者每产生一个数据,消费者就能及时取得该数据并且只取一次。 通过CubbyHole中的put()和get()方法只能保证较低层次的同步. 第一种情况是如果生产者比消费者快,那么在消费者来不及取前一个数据之前,生产者又产生了新的数据。 于是,消费者很可能就会跳过前一个数据,这样就会有下面的结果: 生产者 消

文档评论(0)

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

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

1亿VIP精品文档

相关文档