线程-生产者与消费者问题(JAVA实现)

问题描述

生产者与消费者问题(JAVA实现)
 public class TestProducerConsumer{    public static void main(String[] agrs){        SyncStack ss = new SyncStack();        Producer p = new Producer(ss);        ConSumer c = new ConSumer(ss);        new Thread(p).start();        new Thread(c).start();    }}class Woto{    int id;    public Woto(int id){        this.id = id;    }    public String toString(){        return ""Woto:"" + id;    }}class SyncStack{    int index = 0;    Woto[] w = new Woto[8];    public synchronized void push(Woto wt){        while(index == w.length){            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        this.notify();        w[index] = wt;        index++;    }    public synchronized Woto pop(){        while(index == 0){            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        this.notify();        index--;        return w[index];    }}class Producer implements Runnable{    SyncStack ss = null;    public Producer(SyncStack ss){        this.ss = ss;    }    public void run() {        for(int i = 0;i<10;i++){            Woto wt = new Woto(i);            ss.push(wt);            System.out.println(""生产了=""+wt);            try {                Thread.sleep((int) (Math.random() * 200));            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}class ConSumer implements Runnable{    SyncStack ss = null;    public ConSumer(SyncStack ss){        this.ss = ss;    }    public void run() {        for(int i = 0;i<10;i++){            Woto wt =ss.pop();            System.out.println(""消费了=""+wt);            try {                Thread.sleep((int) (Math.random() * 1000));            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}

为什么会先出现消费者呢 ?求大神解答

这里很明显是先start生产者 怎么可能先消费者呢
new Thread(p).start();
new Thread(c).start();

解决方案

线程是异步的,不是你先写了谁谁就在前,看最好的效果就是弄2个线程通执行一个方法,,要想同步的只能是在同用一个方法时使用synchronized来修饰方法

解决方案二:
线程本来就是异步的,谁先开始都是可能,这个需要你通过消息队列等来控制,或者消费者启动后,发现没有任务就先等待

解决方案三:
class Producer implements Runnable { ?
?
??? private String producerName = null;?
?
??? private StoreHouse storeHouse = null;?
?
??? public Producer(String producerName StoreHouse storeHouse) {......
答案就在这里:java实现生产者与消费者问题

时间: 2024-09-11 01:15:26

线程-生产者与消费者问题(JAVA实现)的相关文章

同步线程--生产者与消费者模式

同步线程的一种经典设计模式. public class Test { public static void main(String[] args) {  Quene q = new Quene();  Producter producter = new Producter(q);  Customer customer = new Customer(q);   producter.start();  customer.start(); }} //生产者public class Producter

JAVA线程中的生产者和消费者问题

生产者消费者问题是研究多线程时绕不开的问题,描述的是有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品,这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品而终止,也不能因缓冲区空消费者无产品可取而终止. 解决生产者消费者问题的方法有两种,一种是采用某种机制保持生产者和消费者之间的同步,一种是在生产者和消费者之间建立一个管道.前一种有较高的效率并且可控制性较好,比较常用,后一种由于管道缓冲区不易控制及被传输数据对象不易封装等原因,比较少用. 同步问题的核心在

java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]

线程通信,线程之间的消息传递: 多个线程在操作同一个资源,但对共享资源的操作动作不同:它们共享同一个资源,互为条件,相互依赖,相互通信让任务向前推进. 线程的同步,可以解决并发更新同一个资源,实现线程同步;但不能用来实现线程间的消息传递. 线程通信生产者和消费者和仓库是个典型模型: 生产者:没有生产之前通知消费者等待,生产产品结束之后,马上通知消费者消费 消费者:没有消费之前通知生产者等待,消费产品结束之后,通知生产者继续生产产品以供消费 线程通信:使用java中Object中提供的: publ

浅谈java线程中生产者与消费者的问题_java

一.概念 生产者与消费者问题是一个金典的多线程协作的问题.生产者负责生产产品,并将产品存放到仓库:消费者从仓库中获取产品并消费.当仓库满时,生产者必须停止生产,直到仓库有位置存放产品:当仓库空时,消费者必须停止消费,直到仓库中有产品. 解决生产者/消费者问题主要用到如下几个技术:1.用线程模拟生产者,在run方法中不断地往仓库中存放产品.2.用线程模拟消费者,在run方法中不断地从仓库中获取产品.3  . 仓库类保存产品,当产品数量为0时,调用wait方法,使得当前消费者线程进入等待状态,当有新

JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止

JAVA之旅(十五)--多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止 我们接着多线程讲 一.生产者和消费者 什么是生产者和消费者?我们解释过来应该是生产一个,消费一个,的意思,具体我们通过例子来说 package com.lgl.hellojava; //公共的 类 类名 public class HelloJJAVA { public static void main(String[] args) { /** * 生产者和消费者

Java并发编程中的生产者与消费者模型简述_java

概述对于多线程程序来说,生产者和消费者模型是非常经典的模型.更加准确的说,应该叫"生产者-消费者-仓库模型".离开了仓库,生产者.消费者就缺少了共用的存储空间,也就不存在并非协作的问题了. 示例定义一个场景.一个仓库只允许存放10件商品,生产者每次可以向其中放入一个商品,消费者可以每次从其中取出一个商品.同时,需要注意以下4点: 1.  同一时间内只能有一个生产者生产,生产方法需要加锁synchronized. 2.  同一时间内只能有一个消费者消费,消费方法需要加锁synchroni

关于线程生产者消费者的问题

问题描述 关于线程生产者消费者的问题 下面的程序运行的时候会一上来t2消费者线程抛异常Exception in thread ""t2"" java.lang.ArrayIndexOutOfBoundsException: -1因为当t2进入等待状态的时候,t4获得所有权,马上t4又进入等待状态,唤醒之前的t2当t2被唤醒再运行的时候已经是从bag.wait();的下一行运行,所以会抛异常.请问怎么才能避免呢?我的bag.notify()的位置是不是放的不对呢? p

Java经典多线程问题--生产者与消费者

今天研究了一下Java多线程,顺便写了一下多线程中的经典问题-–生产者消费者经典问题,推荐一个线程链接Java基础知识回顾–线程 这个里面其实写了生产者与消费者问题,估计在后面大家看起来比较费劲,所以我提取出来再讲解一遍. package yanning; public class ProducerConsumer { public static void main(String[] args) { Tong tong = new Tong(); Producer p = new Produce

java 多线程生产者和消费者模式,怎么实现边生产边消费?

问题描述 java 多线程生产者和消费者模式,怎么实现边生产边消费? 如何使用java语言开发处理一批数据,使处理时间变快,而又不遗漏数据呢?? 解决方案 看瓶颈在哪里,如果是cpu.io的开销,性能不可能无限提高.如果存在网络延迟等,可以用多线程隐藏延迟,达到提高性能的目的. 解决方案二: 你说的什么叫边生产边消费呢?生产者消费者设计实现设计中生产者把数据放入队列,消费者从队列中获取数据处理,消除了生产者和消费者之间的代码依赖.该模式将生产数据的过程与使用数据的过程解耦,简化了由于这两个过程不