Java多线程,生产消费问题

问题描述

package thread;public class Producer_ConsumerTest {public static void main(String[] args) {SyncStack ss = new SyncStack();Thread producter = new Producter(ss);Thread consumer = new Consumer(ss);producter.start();consumer.start();}}class SyncStack {private int total = 0;private boolean flag = false;synchronized void product() {while(flag == true) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}total++;flag = true;this.notify();}synchronized int conmuse() {while(flag == false) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}total--;flag = false;this.notify();return total;}}class Producter extends Thread {SyncStack ss;Producter(SyncStack ss) {this.ss = ss;}public void run() {for(int i=1;i<10;i++) {ss.product();System.out.println("生产者" + Thread.currentThread().getName() + "生产了第" + i + "个商品,商品总数为");}}}class Consumer extends Thread {SyncStack ss;Consumer(SyncStack ss) {this.ss = ss;}public void run() {for(int i=1;i<10;i++) {ss.conmuse();System.out.println("消费者" + Thread.currentThread().getName() + "消费了第" + i + "个商品总数为");}}}-----------------我希望的输出结果是生产1个,然后消费1个,生产在前,但是达不到要求,目前实际输出是无序的,哪位朋友能帮忙修改一下吗? 问题补充:250846434 写道

解决方案

额。。发现一个问题this.notify(); 加在a()方法里面,return上面。
解决方案二:
synchronized int a(int i){total+=i;if(total==0){flag = false;}else{flag = true;}return total;}void product() {while (flag == true) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}a(1);}int conmuse() {while (flag == false) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}return a(-1);}我不知道咱俩理解的有误差没,我理解的大概是这样的啊
解决方案三:
额,生产和消费调用同一个同步方法,你现在是调用了两个。。。两个线程没有什么必然的联系。。应该是在conmuse和product中调用同一个同步方法来实现该功能,你现在无序的原因就是方法未结束,已经将flag的値给改变了。

时间: 2024-09-13 23:32:04

Java多线程,生产消费问题的相关文章

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

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

java多线程的同步 通信以及生产消费者问题

Demo1 /*   Runable接口比直接从Thread继承方便的多  .  *    new  Thread(...) ;这样即使我们传递了同一个实现了Runnable接口的多个对象那么 也是多个线程 ,而且多个线程共享数据域. *    否则new Thread 创建的多个线程之间 互不相干  ,数据之间互不干涉 *    同步就是为了实现 在多个线程同时对一个资源进行操作的时候 要一个一个的执行 , *    只有等占有CPU的 线程完事之后 其他等待线程才能进入就绪状态等待运行 * 

java多线程和并发包入门示例_java

一.java多线程基本入门java多线程编程还是比较重要的,在实际业务开发中经常要遇到这个问题. java多线程,传统创建线程的方式有两种. 1.继承自Thread类,覆写run方法. 2.实现Runnable接口,实现run方法. 启动线程的方法都是调用start方法,真正执行调用的是run方法.参考代码如下: 复制代码 代码如下: package com.jack.thread; /** * 线程简单演示例子程序 *  * @author pinefantasy * @since 2013-

Java多线程与并发库高级应用

想快速精通多线程?看这里  http://blog.chinaunix.net/uid-540802-id-4431193.html 什么是线程         线程,是程序执行流的最小单元.是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源,一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行.在单个程序中同时运行多个线程完成不同的工作,称为多线程.当自己想

java多线程,生产者消费者问题.

问题描述 java多线程,生产者消费者问题. 新手,在试着生产者消费者问题,刚开始的时候,SyncStack为空,但是会出现先执行c那个线程,打印出eat 0.然后才是produce: 0.jdk1.8的环境. 这个是为什么呀 public class ProducerConsumer{ public static void main(String[] args){ SyncStack ss = new SyncStack(); Producer p = new Producer(ss); Co

java多线程 读取队列数据,减少耦合性怎么做?

问题描述 java多线程 读取队列数据,减少耦合性怎么做? 本人不太擅长多线程,但最近因为工作需要,使用到了,所以来求助了,需求这样的:要固定创建线程池跑线程,同时访问数据进来了后加入队列,线程去读取队列后处理程序,这样使访问数据和线程耦合性降低,彼此减少影响.这个代码怎么写,谁能给个demo,知道的别写个大概,写详细点,谢谢了.(我原来是来一个访问就new一个线程处理,老大说这样不好,就提了这样的要求) 解决方案 建议楼主使用反射试试 解决方案二: 我觉得反射应该可以解决这个问题,可是反射不怎

Java多线程知识小抄集(二)

本文主要整理博主遇到的Java多线程的相关知识点,适合速记,故命名为"小抄集".本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆. 27. ConcurrentHashMap ConcurrentHashMap是线程安全的HashMap,内部采用分段锁来实现,默认初始容量为16,装载因子为0.75f,分段16,每个段的HashEntry<K,V>[]大小为2.键值都不能为null.每次扩容为原来容量的2倍,Concurre

整理总结Java多线程程序编写的要点_java

线程状态图 线程共包括以下5种状态. 1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪状态(Runnable): 也被称为"可执行状态".线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程.例如,thread.start().处于就绪状态的线程,随时可能被CPU调度执行. 3. 运行状态(Running) : 线程获取CPU权限进行执行.需要注意的是,

详解Java多线程编程中互斥锁ReentrantLock类的用法_java

0.关于互斥锁 所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. 而现在, Lock提供了比synchronized机制更广泛的锁定操作, Lock和synchronized机制的主要区别: synchronized机制提供了对与每个对象相关的隐式监视器锁的访问, 并强制所有锁获取和释放均要出现在一个块结构中, 当获取了多个锁时, 它们必须以相反的顺序释放. synchronized机制对锁的释放是

Java多线程的用法详解_java

1.创建线程   在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( );  public Thread(Runnable target);  public Thread(String name);  public Thread(Runnable targ