java多线程中的生产者与消费者之等待唤醒机制@Version2.0
二、生产者消费者模式的学生类成员变量生产与消费demo,
@Version2.0
在学生类中添加同步方法:synchronized get()消费者,synchronized set()生产者
最终版的代码中: 把student的成员变量给私有化了,
把设置和获取的功能给封装成了功能,并加了同步,
设置或者获取的线程里面只需要调用方法即可。
1、等待唤醒:
Object类中提供了三个方法:
wait():等待
notify():唤醒单个线程
notifyAll():唤醒所有线程
//==========================
//首先是重点学生类对象
public class Student {
private String name;
private int age;
private boolean flag;
// 同步方法
public synchronized void set(String name, int age) {
// 如果有数据就等待
if (this.flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 设置数据
this.name = name;
this.age = age;
// 一旦有了数据修改标记,并唤醒
this.flag = true;
this.notify();
}
// 同步获取方法
public synchronized void get() {
// 如果没有数据就等待
if (!this.flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 获取数据
System.out.println(this.name + "--- " + this.age);
//获取到数据后,修改标记为false,最后唤醒。
this.flag = false;
this.notify();
}
// 生产者的线程,这次超级简单~~~··
public class setThread implements Runnable {
private Student s;
private int x = 0;
public setThread(Student s) {
this.s = s;
}
@Override
public void run() {
while (true) {
if (x % 2 == 0) {
s.set("java", 30);
} else {
s.set("Android", 20);
}
x++;
}
}
}
// 消费者的线程,这次超级简单~~~··
public class getThread implements Runnable {
private Student s;
public getThread(Student s) {
this.s = s;
}
public void run() {
while (true) {
s.get();
}
}
}
// 消费者的线程,这次超级简单~~~··
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多线程中的生产者与消费者之等待唤醒机制@Version2.0的更多相关文章
- java多线程中的生产者与消费者之等待唤醒机制@Version1.0
一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒: Object类中提供了三个方法: wait():等待 notify():唤醒单个线程 notify ...
- 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 本文关注的重点是,避免内核线程的无效唤醒,并且主要是关注消费者线程的设计 ...
随机推荐
- ionic 上拉加载更多&瀑布流加载&滚动到底部加载更多 主意事项
首先下拉刷新的代码是这样的,标红的地方为关键代码 <html> <head> <meta charset="utf-8"> <meta n ...
- Android Service学习之AIDL, Parcelable和远程服务
AIDL的作用 由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象.在Android平台,一个进程通常不能访问另一个进程的内存空 ...
- Vue.2.0.5-模板语法
Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解 ...
- lua对模块接口扩展的一种方法
module lua中模块的实现,对于使用者来说就是一个库,引用此库后,可以调用库中实现的任意函数. 使用库,可以将一类功能相关的接口做封装,并提供开放接口. 参考: http://blog.codi ...
- 各种设备的CSS3 MediaQuery整理及爽歪歪写法
链接:http://dwz.cn/1gZQ06 ------------------------------------------------------ 备注:内容未测试过,转载的,留着备用. - ...
- 让show parameter显示隐含参数(12C)
1.创建视图show_hidden_v$parameter create or replace view show_hidden_v$parameter (inst_id,NUM , NAME , T ...
- Java基础之写文件——在通道写入过程中的缓冲区状态(BufferStateTrace)
控制台程序,在Junk目录中将字符串“Garbage in, garbage out\n”写入到名为charData.txt的文件中. import static java.nio.file.Stan ...
- SqlServer:传递超长字符串参数时,参数被自动换行。
declare @ids nvarchar(max); set @ids=N'5936593066,5936556893,59366 00375,5936594808,59 36624757,5936 ...
- 链表操作,空间复杂度要求为O(1)
对于O(1)的空间复杂度要求,不能对链表进行复制等操作,双指针法对处理该类问题比较有效. 同时由于链表头结点的特殊性,可以考虑引入一个空的头结点来辅助操作.
- java BigInteger
用Java来处理高精度问题,相信对很多ACMer来说都是一件很happy的事,简单易懂.用Java刷了一些题,感觉Java还不错,在处理高精度和进制转换中,调用库函数的来处理.下面是写的一些Java中 ...