java多线程中的生产者与消费者之等待唤醒机制@Version2.0

二、生产者消费者模式的学生类成员变量生产与消费demo,

@Version2.0

  在学生类中添加同步方法:synchronized get()消费者,synchronized set()生产者

  最终版的代码中: 把student的成员变量给私有化了,
  把设置和获取的功能给封装成了功能,并加了同步,
  设置或者获取的线程里面只需要调用方法即可。

1、等待唤醒:
      Object类中提供了三个方法:
      wait():等待
      notify():唤醒单个线程
      notifyAll():唤醒所有线程
//==========================

//首先是重点学生类对象

 1 public class Student {
 2     private String name;
 3     private int age;
 4     private boolean flag;
 5
 6     // 同步方法
 7     public synchronized void set(String name, int age) {
 8         // 如果有数据就等待
 9         if (this.flag) {
10             try {
11                 this.wait();
12             } catch (InterruptedException e) {
13                 e.printStackTrace();
14             }
15         }
16
17         // 设置数据
18         this.name = name;
19         this.age = age;
20
21         // 一旦有了数据修改标记,并唤醒
22         this.flag = true;
23         this.notify();
24     }
25
26     // 同步获取方法
27     public synchronized void get() {
28         // 如果没有数据就等待
29         if (!this.flag) {
30             try {
31                 this.wait();
32             } catch (InterruptedException e) {
33                 e.printStackTrace();
34             }
35         }
36         // 获取数据
37         System.out.println(this.name + "--- " + this.age);
38         //获取到数据后,修改标记为false,最后唤醒。
39         this.flag = false;
40         this.notify();
41     }

// 生产者的线程,这次超级简单~~~··

 1 public class setThread implements Runnable {
 2     private Student s;
 3     private int x = 0;
 4
 5     public setThread(Student s) {
 6         this.s = s;
 7     }
 8
 9     @Override
10     public void run() {
11         while (true) {
12
13             if (x % 2 == 0) {
14                 s.set("java", 30);
15             } else {
16                 s.set("Android", 20);
17             }
18             x++;
19         }
20
21     }
22
23 }

// 消费者的线程,这次超级简单~~~··

 1 public class getThread implements Runnable {
 2     private Student s;
 3
 4     public getThread(Student s) {
 5         this.s = s;
 6     }
 7
 8     public void run() {
 9         while (true) {
10             s.get();
11         }
12     }
13 }

// 消费者的线程,这次超级简单~~~··

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //共享数据,外界创建,作为参数,通过构造共有
 4         Student s = new Student();
 5         //在构造中使用同一个参数
 6         setThread st = new setThread(s);
 7         getThread gt = new getThread(s);
 8
 9         Thread t1 = new Thread(st);// 设置数据
10         Thread t2 = new Thread(gt); // 获取数据
11
12         t2.start();
13         t1.start();
14     }
15 }
时间: 2024-12-09 15:19:31

java多线程中的生产者与消费者之等待唤醒机制@Version2.0的相关文章

java多线程中的生产者与消费者之等待唤醒机制@Version1.0

一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒:    Object类中提供了三个方法:    wait():等待    notify():唤醒单个线程    notifyAll():唤醒所有线程2.为什么这些方法不定义在Thread类中呢?  这些方法的调用必须通过锁对象调用,而我们刚才使用的锁对象是任意锁对象.  所以,这些方法必须定义在Object类中.3.当我们在使用多线程的时候有的时候需要,一条线程产生一个数据,另一条线程接着消费一个数据,一边生产一边消费,

Android(java)学习笔记71:生产者和消费者之等待唤醒机制

首先我们根据梳理我们之前Android(java)学习笔记70中关于生产者和消费者程序思路: 下面我们就要重点介绍这个等待唤醒机制: 第一步:还是先通过代码体现出等待唤醒机制 package cn.itcast_05; /* * 分析: * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread(消费者) * 测试类:StudentDemo * * 问题1:按照思路写代码,发现数据每次都是:null---0 * 原因:我们在每个线程中都创建了

java多线程(死锁,lock接口,等待唤醒机制)

一.Lock接口 常用方法 Lock提供了一个更加面对对象的锁,在该锁中提供了更多的操作锁的功能. 使用Lock接口,以及其中的lock()方法和unlock()方法替代同步,对电影院卖票案例中Ticket类进行如下代码修改: public class Ticket implements Runnable { //共100票 int ticket = 100; //创建Lock锁对象 Lock ck = new ReentrantLock(); @Override public void run

18、多线程 (线程安全、线程同步、等待唤醒机制、单例设计模式)

线程操作共享数据的安全问题 *A:线程操作共享数据的安全问题 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码. 程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 售票的案例 *A:售票的案例 /* - 多线程并发访问同一个数据资源 - 3个线程,对一个票资源,出售 */ public class ThreadDemo { public static void main(String[] args) { //创建Runnable接口实现

并发协作:多线程中的生产者与消费者模型

对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一样,Hello World!都是最经典的例子. 实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了. 对于此模型,应该明确一下几点: 1.生产者仅仅在仓储未满时候生产,仓满则停止生产. 2.消费者仅仅在仓储有产品时候才能消费,仓空则等待. 3.当消费者发现仓储没产品可消费时候会通知生产者生产. 4.生产者在生产出可消费产品时候,应该通知等待的消费者去消费.

Java多线程设计模式(2)生产者与消费者模式

1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不匹配. 当要从某个线程Produccer参与者将数据传输给其它线程Consumer参与者的时候,此时就可以在中间加一个Channel参与者,在Channel参与者中以某种方式存放接受的数据,再以某方式来获取收到的数据,Channel就可以来缓存两个线程之间传输的数据,在Channel参与者为了保证安

Java多线程与并发——生产者与消费者应用案例

多线程的开发中有一个最经典的操作案例,就是生产者-消费者,生产者不断生产产品,消费者不断取走产品. package com.vince; /** * 生产者与消费者案例 * @author Administrator * */ public class ThreadDemo4 { public static void main(String[] args) { // TODO 自动生成的方法存根 Food food=new Food(); Producter p=new Producter(fo

Linux内核中实现生产者与消费者(避免无效唤醒)

本文关注的重点是,避免内核线程的无效唤醒,并且主要是关注消费者线程的设计. 因此,为了省事,这里关与生产者,消费者本身的处理流程可能不够严密. 1. 生产者 一个内核线程,每生产一个商品后,就唤醒消费者,然后自己睡眠1秒钟. 2. 消费者 一个内核线程,每当被唤醒后,就消费商品,然后进入睡眠. 对于消费者线程的这种设计,有几个好处:响应快,平时不占任何cpu. 但这种设计有一点要注意,那就是要避免线程的无效唤醒.如何实现,看看消费者线程的代码就知道了. /* * kernel programmi

java之等待唤醒机制(线程之间的通信)

线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同.比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题. 为什么要处理线程间通信: 多个线程并发执行时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律的执行, 那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据. 如何保证线程间通信有效利