Java——线程间通信
body, table{font-family: 微软雅黑; font-size: 10pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
等待唤醒机制
| Baozi.java | TestMain.java |
|
package com.java.thread_PV;
public class Baozi {
private String name;
private String price;
private boolean flag; //flag 为false的时候表示没有数据,为true表示有数据;不初始化默认为FALSE
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public Baozi(String name, String price) {
super();
this.name = name;
this.price = price;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
|
package com.java.thread_PV;
public class TestMain {
public static void main(String[] args) {
Baozi baozi=new Baozi(null,null); //同一个对象,后面确保同一把锁
Producer producer=new Producer(baozi);
Customer customer=new Customer(baozi);
producer.start();
customer.start();
}
}
|
| Producer.java | Customer.java |
|
package com.java.thread_PV;
public class Producer extends Thread {
Baozi baozi;
public Producer(Baozi baozi2) {
baozi = baozi2;
}
public void run() {
super.run();
int i = 0;
while (true) {
synchronized (baozi) { //notify 和 wait 机制需要放到同步代码快里使用
if (baozi.isFlag()) { // flag 为true表示有包子
// 等待 (放弃执行权,让其他线程执行。消费者去消费)
try {
baozi.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 没有包子就生产
if (i % 2 == 0) {
baozi.setName("天津狗不理");
baozi.setPrice("10RMB");
} else {
baozi.setName("无锡灌汤包");
baozi.setPrice("5RMB");
}
i++;
// 生产完之后?改变标记flag为true,通知消费者来消费
baozi.setFlag(true);
baozi.notify(); // 通知消费者,但是消费者并不能立即执行;要等后面的代码全部执行完释放锁后,消费者进程抢到锁才能执行
}
}
}
}
|
package com.java.thread_PV;
public class Customer extends Thread {
Baozi baozi;
public Customer(Baozi baozi2) {
baozi = baozi2;
}
public void run() {
super.run();
while (true) {
synchronized (baozi) {
if (!baozi.isFlag()) { // false 表示没有包子,就等待
try {
baozi.wait(); //等待的时候放弃cpu执行权。。但是这里要释放锁!!这里wait方法会自动释放锁,所以不会形成死锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果有就消费
System.out.println("Customer.consume()" + baozi.getName() + " :" + baozi.getPrice());
// 消费完就修改标记,通知生产者去生产
baozi.setFlag(false);
baozi.notify(); // 通知生产者,notify不会释放锁,如果下面还有代码,这里还会接着执行,不会释放锁;另外的进程不会拿到锁,会进入同步阻塞;拿到锁就进入就绪状态
}
}
}
}
|
Java——线程间通信的更多相关文章
- Java线程间通信-回调的实现方式
Java线程间通信-回调的实现方式 Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互. 比如举一个简单例子,有一个多线程的 ...
- Java线程间通信之wait/notify
Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式.我们来看下相关定义: w ...
- java线程间通信:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...
- 说说Java线程间通信
序言 正文 [一] Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在 ...
- 说说 Java 线程间通信
序言 正文 一.Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在一个 ...
- java线程间通信1--简单实例
线程通信 一.线程间通信的条件 1.两个以上的线程访问同一块内存 2.线程同步,关键字 synchronized 二.线程间通信主要涉及的方法 wait(); ----> 用于阻塞进程 noti ...
- java线程间通信之通过管道进行通信
管道流PipeStream是一种特殊的流,用于在不同线程间直接传送数据,而不需要借助临时文件之类的东西. jdk中提供了四个类来使线程间可以通信: 1)PipedInputStream和PipedOu ...
- Java——线程间通信问题
wait和sleep区别: 1.wait可以指定时间可以不指定. sleep必须指定时间. 2.在同步时,对cpu的执行权和锁的处理不同. wait:释放执行权,释放锁. ...
- Java线程间通信
1.由来 当需要实现有顺序的执行多个线程的时候,就需要进行线程通信来保证 2.实现线程通信的方法 wait()方法: wait()方法:挂起当前线程,并释放共享资源的锁 notify()方法: not ...
随机推荐
- ACM-ICPC 2018 沈阳赛区网络预赛 Made In Heaven(K短路)题解
思路:K短路裸题 代码: #include<queue> #include<cstring> #include<set> #include<map> # ...
- HDU1043 Eight(八数码:逆向BFS打表+康托展开)题解
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- redis安装使用配置
一.安装前的准备 下载redis http://redis.io/download https://github.com/mythz/redis-windows 下载Windows版客户端net版sd ...
- 委托的begininvoke
http://blog.csdn.net/cml2030/article/details/2172854 http://blog.163.com/weizhiyong_111/blog/static/ ...
- Codeforces 1091 Good Bye 2018
占个坑先,希望不要掉的太惨了吧,不要掉到上一次之前的rating upt:flag竟然没到,开心. A - New Year and the Christmas Ornament 好像没什么可说的. ...
- OI无关--关于侧边栏
自己在比较闲的时候学了一点html和js,大概能写一些比较简单的东西了,于是就动起了侧边栏的念头. 如果能在博客里加一个题目快速跳转也很兹磁啊. 首先要选择题目,oj的名字肯定是不能直接输入,因为还有 ...
- NOIP2018 退役记
NOIP挂完,OI再见 AFO Day 0 早上的高铁,1点多到广州,2点多到酒店,下午就是颓颓颓,然后晚上随便刷了一下板子,反正PJ也没啥板子可以刷 就这样浪费了一天,我到底在干嘛 Day 1 早上 ...
- 【Ctsc2011】幸福路径
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2306 给定一张有向图,每个点有权值,蚂蚁从某个节点出发,初始体力值为$1$,每走一条边$体 ...
- ros rviz 启动指定的rviz 文件
rviz -d rviz文件名 例如:rviz -d myname.rviz
- jenkins 插件,下载地址
http://updates.jenkins-ci.org/download/plugins/ 通常我们需要下载的插件有如下几个: