【java】多线程同步生产者消费者问题
package 多线程;
class Producer implements Runnable{
private Data data;
public Producer(Data data){
this.data=data;
}
@Override
public synchronized void run() {
for(int i=0;i<50;i++){
if(i%2==0){
this.data.setTitle("饼干");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.data.setValue("麦香饼干");
}else{
this.data.setTitle("饮料");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.data.setValue("果汁好喝");
}
}
}
}
class Consumer implements Runnable{
private Data data;
public Consumer(Data data){
this.data=data;
}
@Override
public synchronized void run() {
for(int i=0;i<50;i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费:"+this.data.getTitle()+"->"+this.data.getValue());
}
}
}
class Data{
private String title;
private String value;
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
public class TestProducerConsumer {
public static void main(String[] args) {
Data data=new Data();
new Thread(new Producer(data)).start();
new Thread(new Consumer(data)).start();
}
}
数据错乱
package 多线程;
class Producer implements Runnable{
private Data data;
public Producer(Data data){
this.data=data;
}
@Override
public void run() {
for(int i=0;i<50;i++){
if(i%2==0){
this.data.set("饼干","麦香饼干");
}else{
this.data.set("饮料","果汁好喝");
}
}
}
}
class Consumer implements Runnable{
private Data data;
public Consumer(Data data){
this.data=data;
}
@Override
public void run() {
for(int i=0;i<50;i++){
System.out.println("消费:"+this.data.get());
}
}
}
class Data{
private String title;
private String value;
public synchronized void set(String title,String value) {
//若不加synchronized仍会有数据错乱现象
this.title = title;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.value=value;
}
public synchronized String get() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return title+"->"+value;
}
}
public class TestProducerConsumer {
public static void main(String[] args) {
Data data=new Data();
new Thread(new Producer(data)).start();
new Thread(new Consumer(data)).start();
}
}
解决错乱,但有重复现象(非奇偶交替)
package 多线程;
class Producer implements Runnable{
private Data data;
public Producer(Data data){
this.data=data;
}
@Override
public void run() {
for(int i=0;i<50;i++){
if(i%2==0){
this.data.set("饼干","麦香饼干");
}else{
this.data.set("饮料","果汁好喝");
}
}
}
}
class Consumer implements Runnable{
private Data data;
public Consumer(Data data){
this.data=data;
}
@Override
public void run() {
for(int i=0;i<50;i++){
System.out.println("消费:"+this.data.get());
}
}
}
class Data{
private boolean flag=true;//如果不初始设置为true可能会在第一个消费时取得null
private String title;
private String value;
public synchronized void set(String title,String value) {
if(this.flag==false)
try {
super.wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
//若不加synchronized仍会有数据错乱现象
this.title = title;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.value=value;
this.flag=false;
super.notify();
}
public synchronized String get() {
if(this.flag==true)
try {
super.wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.flag=true;
super.notify();
return title+"->"+value;
}
}
public class TestProducerConsumer {
public static void main(String[] args) {
Data data=new Data();
new Thread(new Producer(data)).start();
new Thread(new Consumer(data)).start();
}
}
解决重复问题
【java】多线程同步生产者消费者问题的更多相关文章
- Java多线程同步——生产者消费者问题
这是马士兵老师的Java视频教程里的一个生产者消费者问题的模型 public class ProduceConsumer{ public static void main(String[] args) ...
- Java 多线程同步生产者消费者问题-monitor
对这个问题更深一点理解是,每一个线程都在竞争这个类的实例的monitor对象. java会为每个object对象分配一个monitor,当某个对象的同步方法(synchronized methods ...
- java多线程解决生产者消费者问题
import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...
- java多线程模拟生产者消费者问题,公司面试常常问的题。。。
package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...
- Java多线程_生产者消费者模式2
在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的.在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻 ...
- JAVA多线程之生产者 消费者模式 妈妈做面包案例
创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包 最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...
- 【多线程】java多线程实现生产者消费者模式
思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...
- Java多线程之生产者消费者问题<一>:使用synchronized keyword解决生产者消费者问题
今天看了一片博文,讲Java多线程之线程的协作,当中作者用程序实例说明了生产者和消费者问题,但我及其它读者发现程序多跑几次还是会出现死锁,百度搜了下大都数的样例也都存在bug,经过细致研究发现当中的问 ...
- Java多线程实现生产者消费者延伸问题
在操作系统中有一类问题被称为生产者消费者问题:意为,有数个生产者生产产品,有数个消费者消费产品,他们共享一定数量的缓存. 这里用java多线程编程,实现生产者消费者问题的一种延伸,橘子苹果问题. 题目 ...
- Java多线程-----实现生产者消费者模式的几种方式
1 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...
随机推荐
- python基础教程——切片
获取list或tuple的部分元素: L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] L[0:3] ['Michael', 'Sarah', 'Tra ...
- csv格式订单下载,完成后伴随邮件通知下载
前言 功能开发中会遇到大量订单下载,而服务器的请求响应时间又配置的很短,导致下载时候请求超时. 这篇文章主要思路:异步查询数据,生成csv文件,放入email中并发送给用户.(异步部分本文不做介绍,配 ...
- 书籍推荐系列之一 -- 《凤凰项目:一个IT运维的传奇故事》
博客已经完全更新了名字,新的名字,新的开始,想让自走向新的道路是很难的,走出舒适圈说了好久,也是时候开始行动了,今天就从写博客开始. 今天给大家推荐一本书,<凤凰项目:一个IT运维的传奇故事&g ...
- Python3 下实现 Tencent AI 调用
1.背景 a.鹅厂近期发布了自己的AI api,包括身份证ocr.名片ocr.文本分析等一堆API,因为前期项目用到图形OCR,遂实现试用了一下,发现准确率还不错,放出来给大家共享一下. b.基于py ...
- WEB漏洞攻击之验证码绕过浅析
最近安全部门对WEB系统进行了一次漏洞整改,发现了某个系统存在验证码绕过风险. 根据安全部门提供的信息,该漏洞构造场景是通过一层中间代理(Burpsuite Proxy)拦截客户端与服务端的请求,通过 ...
- openstack Keystone验证服务集群
#Keystone验证服务群集 openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##.Keystone验证服务集群 ...
- JAVA提高十九:WeakHashMap&EnumMap&LinkedHashMap&LinkedHashSet深入分析
因为最近工作太忙了,连续的晚上支撑和上班,因此没有精力来写下这篇博客,今天上午正好有一点空,因此来复习一下不太常用的集合体系大家族中的几个类:WeakHashMap&EnumMap&L ...
- HDU4046--Panda(树状数组)
Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- CCF-201409-1-相邻数对
问题描述 试题编号: 201409-1 试题名称: 相邻数对 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. ...
- 计算rem
(function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ' ...