之前已经对于线程同步相关的知识点进行了详细的学习,这次来学习一下线程间的通信相关的知识,话不多说直接用代码进行演练,以一个简陋的生产者消费者模型来初步了解下线程间通信是怎么一回事。

生产消费者第一版:

然后具体实现生产消费方法:

此时用两个线程来应用一下:

这时看一下运行结果:

对于一个生产者与一个消费者理解情况应该是生产一个之后则立马被消费掉,以此不断循环,也就是生产一个消费一个,那为啥目前这个极其初级版本的生产消费者的模型没有如咱们的预期呢?答案就是:没有线程之间的通信协作,对于生产者来说它不知道有人消费了,而对于消费者来说它也不知道有人生产了,所以此时线程间的通信场景就诞生了,下面来看加入线程通信之类的改良版本。

生产消费者第二版:

接着来看生产方法:

这里需要注意一个细节,其中的"Lock.wait()"并非是指Thread中的wait(),而是指的Object.wait(),如下:

同样的消费者也得根据这个标识做类似的处理,如下:

另外对于生产者而言,也需要在生产了之后通知正在等待的消费者,如下:

接下来测试一下:

package com.javaconcurrency.threadcommunication;

public class ProductConsumerVersion2 {
private final Object LOCK = new Object();
private int i = 1;
/* 此标识用来说明是否当前已经生产过了,默认没有 */
private volatile boolean isProduced = false; private void product() {
synchronized (LOCK) {
if (isProduced) {
try {
LOCK.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
i++;
System.out.println("P->" + i);
LOCK.notify();
isProduced = true;
}
}
} private void comsume() {
synchronized (LOCK) {
if (isProduced) {
System.out.println("C->" + i);
LOCK.notify();
isProduced = false;
} else {
try {
LOCK.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} public static void main(String[] args) {
ProductConsumerVersion2 productConsumerVersion2 = new ProductConsumerVersion2(); new Thread("P") {
@Override
public void run() {
while (true)
productConsumerVersion2.product();
}
}.start(); new Thread("C") {
@Override
public void run() {
while (true)
productConsumerVersion2.comsume();
}
}.start();
} }

编译运行:

貌似挺完美的,但是!!依然存在缺陷,现在是只有一个生产者和一个消费者,如果有多个生产者与多个消费者的话那就有问题啦,这个在下次再继续改善~

最新文章

  1. HTML5教程之html 5 本地数据库(Web Sql Database)
  2. 洛谷11月月赛round.2
  3. java 基础二 Graphics类
  4. SQL指令中一些特别值得注意的地方
  5. 数据结构之图 Part3 – 2 遍历
  6. kinderEditor + Struts2整合
  7. java web用于保持状态的4种方法
  8. Eclipse启动报错:An internal error occurred during: "Initializing Java Tooling".
  9. beta发布排序结果
  10. 局部更新listview的问题(只更新某个item)
  11. [js高手之路] es6系列教程 - 迭代器与生成器详解
  12. DevOps之软件定义网络SDN
  13. make太慢了,加快编译速度的方法 make -j
  14. 论文阅读笔记二-ImageNet Classification with Deep Convolutional Neural Networks
  15. Python学习之高级数组(一)
  16. jquery返回页面顶部
  17. Java处理JSON的工具类(List、Map和JSON之间的转换)——依赖jsonlib支持Map嵌套
  18. Android安全防护防护———Android 端常见的安全问题
  19. 创建一个接口Shape,其中有抽象方法area,类Circle 、Rectangle实现area方法计算其面积并返回。又有Star实现Shape的area方法,其返回值是0,Star类另有一返回值boolean型方法isStar;在main方法里创建一个Vector,根据随机数的不同向其中加入Shape的不同子类对象(如是1,生成Circle对象;如是2,生成Rectangle对象;如是3,生成S
  20. python16_day39【算法】

热门文章

  1. Flutter easyrefresh示例 上拉加载+下拉刷新
  2. laravel进程管理supervisor的简单说明
  3. Spring 多对对实体
  4. Python 面向对象总结
  5. uniapp跨域两次请求解决方案
  6. c#,回文数判断
  7. Mac10.14.6安装Python3
  8. [转帖]APP逆向神器之Frida【Android初级篇】
  9. Redis 常用命令学四:列表类型命令
  10. PAT(B)1015 德才论(C)