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】多线程同步生产者消费者问题的更多相关文章

  1. Java多线程同步——生产者消费者问题

    这是马士兵老师的Java视频教程里的一个生产者消费者问题的模型 public class ProduceConsumer{ public static void main(String[] args) ...

  2. Java 多线程同步生产者消费者问题-monitor

    对这个问题更深一点理解是,每一个线程都在竞争这个类的实例的monitor对象. java会为每个object对象分配一个monitor,当某个对象的同步方法(synchronized methods ...

  3. java多线程解决生产者消费者问题

    import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...

  4. java多线程模拟生产者消费者问题,公司面试常常问的题。。。

    package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...

  5. Java多线程_生产者消费者模式2

    在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的.在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻 ...

  6. JAVA多线程之生产者 消费者模式 妈妈做面包案例

    创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包  最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...

  7. 【多线程】java多线程实现生产者消费者模式

    思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...

  8. Java多线程之生产者消费者问题&lt;一&gt;:使用synchronized keyword解决生产者消费者问题

    今天看了一片博文,讲Java多线程之线程的协作,当中作者用程序实例说明了生产者和消费者问题,但我及其它读者发现程序多跑几次还是会出现死锁,百度搜了下大都数的样例也都存在bug,经过细致研究发现当中的问 ...

  9. Java多线程实现生产者消费者延伸问题

    在操作系统中有一类问题被称为生产者消费者问题:意为,有数个生产者生产产品,有数个消费者消费产品,他们共享一定数量的缓存. 这里用java多线程编程,实现生产者消费者问题的一种延伸,橘子苹果问题. 题目 ...

  10. Java多线程-----实现生产者消费者模式的几种方式

       1 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...

随机推荐

  1. 一般处理程序获取Session方式

    今天写程序得时候遇到了一个问题:ajax在对ashx进行请求时如果按照 context.Request方式直接来获取值得话获取到得是空值,因此去网上搜了一下问题.现记录如下: ashx获取sessio ...

  2. SpringBoot+Redis环境搭建

    写在正文前的絮叨: 其实这个环境的搭建是很简单的,照着官网给的说明很快就可以搭建测试出来.为什么又要写出来呢?只是为了记录.保留.分享这其中遇到的坑. 这个环境之前在架构一个简单系统时,也曾经搭建过, ...

  3. Tarjan算法:求解图的割点与桥(割边)

    简介: 割边和割点的定义仅限于无向图中.我们可以通过定义以蛮力方式求解出无向图的所有割点和割边,但这样的求解方式效率低.Tarjan提出了一种快速求解的方式,通过一次DFS就求解出图中所有的割点和割边 ...

  4. QT之TCP通信

    QT中可以通过TCP协议让服务器和客户端之间行通信.所以下面我就围绕服务器和客户端来写. 这是我么写服务器和客户端的具体流程: A.服务器: 1.创建QTcpServer对象         2.启动 ...

  5. hdu 2586 How far away ?倍增LCA

    hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增 ...

  6. [行业关键词] review code review

    意思是   代码评审  或是 代码回顾 代码评审是指在软件开发过程中,通过对源代码进行系统性检查的过程.通常的目的是查找系统缺陷,保证软件总体质量和提高开发者自身水平. Code Review是轻量级 ...

  7. 批量去BOM头 遍历目录及子文件,文件夹 PHP源码

    任意php文件,把最后一行替换成自己的目录 即可 <?php class KillBom {     public static $m_Ext = ['txt', 'php', 'js', 'c ...

  8. 浅谈Android中Serializable和Parcelable使用区别

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.概述 Android开发的时候,我们时长遇到传递对象的需求,但是我们无法将对象的引用传给Activity或者Fragment,我们需要将这些对象 ...

  9. UWP 应用程序内购

    今天来说一下应用程序内购的问题,这里面有坑,给自己做个笔记,也给需要的人提个醒. 我目前的需要是可以允许用户捐赠赞助App的形式内购,最终效果如下 只讲上面的列表部分,下面的就是图片布局啥的,没意思了 ...

  10. 76、django之内置Admin

    本篇导航: 配置路由 定制Admin Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django ...