java多线程中的生产者与消费者之等待唤醒机制@Version1.0
一、生产者消费者模式的学生类成员变量生产与消费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的更多相关文章
- java多线程中的生产者与消费者之等待唤醒机制@Version2.0
		
二.生产者消费者模式的学生类成员变量生产与消费demo, @Version2.0 在学生类中添加同步方法:synchronized get()消费者,synchronized set()生产者 最终版 ...
 - Android(java)学习笔记71:生产者和消费者之等待唤醒机制
		
1. 首先我们根据梳理我们之前Android(java)学习笔记70中关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 pac ...
 - Android(java)学习笔记11:生产者和消费者之等待唤醒机制
		
1. 首先我们根据梳理我们之前Android(java)学习笔记70中,关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 下面 ...
 - java ->多线程_线程同步、死锁、等待唤醒机制
		
线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. l 我们通过一个案例,演示线 ...
 - java多线程(死锁,lock接口,等待唤醒机制)
		
一.Lock接口 常用方法 Lock提供了一个更加面对对象的锁,在该锁中提供了更多的操作锁的功能. 使用Lock接口,以及其中的lock()方法和unlock()方法替代同步,对电影院卖票案例中Tic ...
 - Java多线程设计模式(2)生产者与消费者模式
		
1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不 ...
 - Java多线程与并发——生产者与消费者应用案例
		
多线程的开发中有一个最经典的操作案例,就是生产者-消费者,生产者不断生产产品,消费者不断取走产品. package com.vince; /** * 生产者与消费者案例 * @author Admin ...
 - java多线程之多生产者-多消费者
		
多生产者和多消费者是线程通信的经典案例,但是和生产者-消费者相比更为复杂,而且可能会产生程序假死. public class Product { private MyStack myStack; pu ...
 - Linux内核中实现生产者与消费者(避免无效唤醒)【转】
		
转自:http://blog.csdn.net/crazycoder8848/article/details/42581399 本文关注的重点是,避免内核线程的无效唤醒,并且主要是关注消费者线程的设计 ...
 
随机推荐
- 在Visual Studio 2015中运行OPENGL
			
Starting an OpenGL project in VS 2015 is really easy, thanks to the NupenGL.Core nuget package. Here ...
 - Jenkins定时构建项目
			
我们是不是可以自动的来构建项目那么此时我们需要使用Poll SCM和Build periodically,我们在构建触发中选择这两项即可,其实他们两个就是一个自动任务 触发远程构建:触发远程构建Bui ...
 - HtmlAgilityPack教程
			
解析html教程(重点) http://www.cnblogs.com/kissdodog/archive/2013/02/28/2936950.html 完整的教程 http://www.cnblo ...
 - Python模块(scapy)
			
scapy scapy相当于linux的tcpdump的功能
 - iOS - (调用系统本机发送短信功能)
			
今天处理一个订单详情的界面,在订单详情页面上有联系方式(电话号码),在电话号码的右边有两图片,一个是电话样式的,一个是短信样式的,做为一名程序员(号称攻城师)一眼看下去就应该是一个 button,而不 ...
 - Java基础之读文件——使用通道复制文件(FileBackup)
			
控制台程序,除了使用Files类中使用copy()方法将文件复制外,还可以使用FileChannel对象复制文件,连接到输入文件的FileChannel对象能直接将数据传输到连接到输出文件的FileC ...
 - dlopen、dlsym和dlclose的使用
			
在dlopen()函数以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程.使用dlclose()来卸载打开的库. dlopen: dlopen() The function ...
 - csuoj 1329: 一行盒子
			
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1329 1329: 一行盒子 Time Limit: 1 Sec Memory Limit: 12 ...
 - [摘录] 关于 java 并发包
			
1.http://www.raychase.net/698 Java多线程发展简史
 - java 8种基本数据类型
			
数值型--> 整 型:int,short,long,byte 浮点型:double,float 字符型-->char 布尔型-->boolean