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

4、问题解决方案第一步保证线程同步安全:(1)加锁,

   A:不同种类的线程都要加锁。
    B:不同种类的线程加的锁必须是同一把。

5、问题解决方案第二步保证数据的一次生产消费:(等待唤醒机制)。

6、在下面新建的两条线程,两条线程操作的对象都是学会类,一条线程生产学生对象的数据,一条线程消费学生对象的数据,且做到,有数据才消费,没数据就等待,没数据就生产,有数据就等待。

//==========================

//第一个案例是学生类对象,非常的简单就定义了两个成员变量,以及一个用于唤醒线程的标记。

 public class Student {
public String name;
public int age;
boolean flag; //默认情况是false--->没有数据,如果是true说明有数据。 }

//下面的是生产者学生对象的demo

//在构造方法中传递了学生对象,保证生产者与消费者操作的是同一个对象。

 public class setThread implements Runnable {
private Student s;
int x = 0; public setThread(Student s) {
this.s = s;
} @Override
public void run() {
while (true) {
synchronized (s) {
// 唤醒机制,生产者,先判断有没有哦,有就等待被消费,没有就生产数据准备被消费。
if (s.flag) {
try {
s.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} //一旦flag标记为false就执行下面的代码 if (x % 2 == 0) {
s.name = "java";
s.age = 25;
} else {
s.name = "android";
s.age = 20;
}
x++;
// 数据生产一次,此时有了数据需要修改标记,下一循环开始的时候,就暂时不在生产,
s.flag = true; // 唤醒线程
s.notify();
} }
} }

//下面的是学生对象的消费者模式demo

//在构造方法中传递了学生对象,保证生产者与消费者操作的是同一个对象。

 public class getThread implements Runnable {
private Student s; public getThread(Student s) {
this.s = s;
} public void run() {
while (true) {
// 唤醒机制 消费者,有数据就消费,没有数据(!)就等待数据被生产。
// 吐过没有就等待,有就消费
synchronized (s) {
if (!s.flag) { //flag--->false执行if下面的代码:表示没有数据就等待
try {
s.wait(); //在等待的时候立即释放锁,方便其他的线程使用锁。而且被唤醒时,就在此处唤醒,
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // flag--->true:消费数据
System.out.println(s.name + " " + s.age);
// 消费完毕后,数据没有了,修改标记
s.flag = false;
// 唤醒线程
//唤醒并不代表你立即可以得到执行权,此时仍然需要抢CPU的执行权,
s.notify();
}
}
}
}

//下面的是测试用例,就是简单的创建了两条线程,然后启动刚才的生产者与消费者

 /*
* 如何在同一个包下,多个类中共享一个数据:
* 在外界把这个数据创建出来,然后通过构造方法传递给其它的类。
*/
public class Demo {
public static void main(String[] args) {
// 共享数据,外界创建,作为参数,通过构造共有
Student s = new Student();
// 在构造中使用同一个参数
setThread st = new setThread(s);
getThread gt = new getThread(s); Thread t1 = new Thread(st);// 设置数据
Thread t2 = new Thread(gt); // 获取数据 t2.start();
t1.start(); }
}

  

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

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

    二.生产者消费者模式的学生类成员变量生产与消费demo, @Version2.0 在学生类中添加同步方法:synchronized get()消费者,synchronized set()生产者 最终版 ...

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

    1. 首先我们根据梳理我们之前Android(java)学习笔记70中关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 pac ...

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

    1. 首先我们根据梳理我们之前Android(java)学习笔记70中,关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 下面 ...

  4. java ->多线程_线程同步、死锁、等待唤醒机制

    线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. l  我们通过一个案例,演示线 ...

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

    一.Lock接口 常用方法 Lock提供了一个更加面对对象的锁,在该锁中提供了更多的操作锁的功能. 使用Lock接口,以及其中的lock()方法和unlock()方法替代同步,对电影院卖票案例中Tic ...

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

    1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不 ...

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

    多线程的开发中有一个最经典的操作案例,就是生产者-消费者,生产者不断生产产品,消费者不断取走产品. package com.vince; /** * 生产者与消费者案例 * @author Admin ...

  8. java多线程之多生产者-多消费者

    多生产者和多消费者是线程通信的经典案例,但是和生产者-消费者相比更为复杂,而且可能会产生程序假死. public class Product { private MyStack myStack; pu ...

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

    转自:http://blog.csdn.net/crazycoder8848/article/details/42581399 本文关注的重点是,避免内核线程的无效唤醒,并且主要是关注消费者线程的设计 ...

随机推荐

  1. 在Visual Studio 2015中运行OPENGL

    Starting an OpenGL project in VS 2015 is really easy, thanks to the NupenGL.Core nuget package. Here ...

  2. Jenkins定时构建项目

    我们是不是可以自动的来构建项目那么此时我们需要使用Poll SCM和Build periodically,我们在构建触发中选择这两项即可,其实他们两个就是一个自动任务 触发远程构建:触发远程构建Bui ...

  3. HtmlAgilityPack教程

    解析html教程(重点) http://www.cnblogs.com/kissdodog/archive/2013/02/28/2936950.html 完整的教程 http://www.cnblo ...

  4. Python模块(scapy)

    scapy scapy相当于linux的tcpdump的功能

  5. iOS - (调用系统本机发送短信功能)

    今天处理一个订单详情的界面,在订单详情页面上有联系方式(电话号码),在电话号码的右边有两图片,一个是电话样式的,一个是短信样式的,做为一名程序员(号称攻城师)一眼看下去就应该是一个 button,而不 ...

  6. Java基础之读文件——使用通道复制文件(FileBackup)

    控制台程序,除了使用Files类中使用copy()方法将文件复制外,还可以使用FileChannel对象复制文件,连接到输入文件的FileChannel对象能直接将数据传输到连接到输出文件的FileC ...

  7. dlopen、dlsym和dlclose的使用

    在dlopen()函数以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程.使用dlclose()来卸载打开的库. dlopen: dlopen() The function ...

  8. csuoj 1329: 一行盒子

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1329 1329: 一行盒子 Time Limit: 1 Sec  Memory Limit: 12 ...

  9. [摘录] 关于 java 并发包

    1.http://www.raychase.net/698 Java多线程发展简史

  10. java 8种基本数据类型

    数值型--> 整  型:int,short,long,byte 浮点型:double,float 字符型-->char 布尔型-->boolean