`
jaychang
  • 浏览: 734539 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

线程通信机制(生产者与消费者示例)

阅读更多

package org.jaychang.corejava.review;

import java.util.LinkedList;
import java.util.List;

/**
* @title <p>生产者与消费者</p>
* @author Jay Chang
* @date 2009/11/09
*/
class Stack {
private List<Object> list = new LinkedList<Object>();

/**
* 出栈
*
* @return
*/
public Object pop() {
   return list.remove(list.size() - 1);
}

/**
* 将元素压入栈
*
* @param obj
*/
public void push(Object obj) {
   list.add(list.size(), obj);
}

public int size() {
   return list.size();
}
}

/**
*
* @author Jay Chang
*
*/
class Producer extends Thread {
private Stack stack;

public Stack getStack() {
   return stack;
}

/**
*
* @param stack
*/
public void setStack(Stack stack) {
   this.stack = stack;
}

/**
* 生产者生产商品,当商品栈满时,通知消费者消费商品
*/
public void produce() {
   for (int i = 0; i < 100; i++) {
    // 同步stack
    synchronized (stack) {
     System.out.println("producer get the lock");

//这里指定存放商品的商品栈的最大容量为10

     while (stack.size() == 10) {
      try {
       //将生产者线程持有stack对象的锁释放,并将生产者线程放到stack对象的等待池中
       stack.wait();
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
     }
     // 模拟生产者生产商品过程所需的时间
     try {
      Thread.sleep(1000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     String goods = "goods" + stack.size();

     //将生产的商品放到存放商品的商品栈中
     stack.push(goods);
     System.out.println("producer product " + goods);
     //唤醒在stack对象等待池中的等待的所有线程
     stack.notifyAll();
    }

   }
}

public void run() {
   produce();
}
}

class Consumer extends Thread {
private Stack stack;

public Stack getStack() {
   return stack;
}

public void setStack(Stack stack) {
   this.stack = stack;
}

/**
*
* 消费者消费商品,当商品栈中为空时通知生产者生产商品
*/
public void consume() {
   for (int i = 0; i < 100; i++) {
    synchronized (stack) {
     System.out.println("consumer get the lock");
     while (stack.size() == 0) {
      try {
       stack.wait();
      } catch (InterruptedException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }
     // 模拟消费者消费商品,所需的时间
     try {
      Thread.sleep(1000);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     Object obj = stack.pop();
     System.out.println("cosumer consume " + obj);
    }
   }
}

public void run() {
   consume();
}

}

public class Test{
public static void main(String[] args) {
   Stack stack = new Stack();
   Consumer consumer = new Consumer();
   consumer.setStack(stack);
   Producer producer1 = new Producer();
   producer1.setStack(stack);
   Producer producer2 = new Producer();
   producer2.setStack(stack);
   consumer.start();producer1.start();producer2.start();

}
}

分享到:
评论
3 楼 jaychang 2011-02-25  
缓冲区是一个共享资源,必须互斥访问的
2 楼 julydave 2011-02-12  
julydave 写道
From 百度知道:首先谢谢您的提示,我这个是没有对缓冲区直接设锁,看了您的例子,您那个是直接对栈设置锁了,但我觉得我这个更符合实际情况吧,我在synchronized(this)处是对生产者或者消费者单独设锁,生产者和消费者不互斥,还有就是wait那个循环,这也都是仿照《Thinking in Java 4th Edition》中的例子,我知道生产者和消费者还有很多各种各样的实现,但我现在迫切知道我这个实现的错误在什么地方,为什么wait没有把第9个线程锁住。



http://zhidao.baidu.com/question/224475092.html
1 楼 julydave 2011-02-12  
From 百度知道:首先谢谢您的提示,我这个是没有对缓冲区直接设锁,看了您的例子,您那个是直接对栈设置锁了,但我觉得我这个更符合实际情况吧,我在synchronized(this)处是对生产者或者消费者单独设锁,生产者和消费者不互斥,还有就是wait那个循环,这也都是仿照《Thinking in Java 4th Edition》中的例子,我知道生产者和消费者还有很多各种各样的实现,但我现在迫切知道我这个实现的错误在什么地方,为什么wait没有把第9个线程锁住。

相关推荐

    bcb 多线程示例 MutilThread(生产者与消费者)

    在本示例"bcb 多线程示例 MutilThread(生产者与消费者)"中,我们将探讨 Borland C++ Builder (bcb) 平台上的线程应用,特别是生产者-消费者问题的解决方案。 生产者-消费者问题是多线程编程中的一个经典案例,它...

    多线程_生产者与消费者模式示例

    线程池可以配合生产者消费者模式,例如通过提交任务到线程池来实现生产者,线程池中的工作线程充当消费者角色。 在使用生产者消费者模式时,需要注意以下几点: - **线程安全**:确保所有的操作都是线程安全的,...

    JAVA实现线程间同步与互斥生产者消费者问题

    在`JThreadSynch`这个压缩包文件中,我们可以预见到包含的Java源代码将展示以上的一种或多种机制,通过具体的示例代码来解释和实现生产者消费者问题的线程同步和互斥。通过学习和理解这个示例,开发者可以更好地掌握...

    多线程模拟实现生产者/消费者模型

    在给定的压缩包文件"生产者与消费者代码"中,很可能包含了实现这一模型的示例代码。通过阅读和分析这些代码,你可以更好地理解如何在实际项目中应用生产者/消费者模型。例如,你可能会看到如何创建线程,如何初始化...

    计算机操作系统 利用信号量机制模拟 生产者与消费者问题

    4. 通信与退出:生产者和消费者线程通过信号量进行通信,直到所有数据都被消费或者达到预设的退出条件。 通过这样的设计,我们可以保证生产者不会在缓冲区满时继续生产,消费者也不会在缓冲区空时尝试消费,从而...

    java线程安全以及生产者消费者demo

    这个压缩包中的"线程安全_生产者消费者"示例可能包含了使用以上概念和机制的Java代码,你可以通过学习和运行这个示例来深入理解这些并发编程的关键点。分析和理解这个代码,将有助于你在实际项目中有效地解决多线程...

    由生产者/消费者问题看JAVA多线程

    生产者/消费者问题是一个经典的计算机科学问题,用于展示进程间的通信与同步问题。在这个模型中,生产者负责创建数据并将其放置到共享内存区域(通常是一个缓冲区),而消费者则从该缓冲区读取数据并进行处理。为了...

    线程间资源互斥与通信(生产者消费者)

    本实例将深入探讨"生产者消费者"模型,这是线程间通信的一个经典案例,用于展示如何高效地共享有限资源。 生产者消费者模式是一种设计模式,它基于操作系统中的队列数据结构。在该模型中,"生产者"线程负责生成数据...

    Linux进程间通信之生产者消费者

    "生产者消费者"问题是一个经典的多线程或进程同步问题,它用于演示和理解各种IPC机制。在这个场景中,生产者进程负责生成数据,而消费者进程则消费这些数据。下面我们将深入探讨Linux下的几种主要的IPC方法,以及...

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

    在Java编程中,线程的生产者与消费者问题是多线程同步的一个典型应用场景。这个问题源自现实世界中的生产流水线,其中生产者负责制造产品,而消费者则负责消耗这些产品。在计算机系统中,生产者可以是生成数据的线程...

    生产者消费者问题,MFC实现

    生产者消费者问题是多线程编程中的经典模型,用于展示如何高效地在多个线程之间共享资源。MFC(Microsoft Foundation Classes)是微软提供的一套面向对象的C++库,用于构建Windows应用程序。在这个问题中,我们将...

    线程同步生产者消费者问题解析

    "线程同步生产者消费者问题"是多线程编程中一个经典的示例,它涉及到资源的共享、线程间的协作以及等待条件的建立。以下是对这一问题的详细解析。 首先,我们需要了解"生产者消费者问题"的基本模型。在这个模型中,...

    Java线程间的通信----生产者消费者模型

    生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...

    多线程间通信:多生产者-多消费者实例

    下面是一个简单的多生产者-多消费者示例: ```java import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; class Producer implements Runnable { private final ...

    生产者 消费者 模式 c++

    生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等...

    生产者与消费者问题(C++)

    生产者与消费者问题是计算机科学领域中经典的同步问题之一,通常用于演示进程间通信和同步机制的概念。该问题涉及两个类型的进程:生产者和消费者。生产者负责生成数据并将其放入缓冲区中;而消费者则从缓冲区取出...

    p&c.rar_生产者 消费者_生产者与消费者问题_生产者消费者_生产者消费者问题_生产者消费者问题 c

    在C++中实现生产者-消费者问题,通常会用到线程同步机制,如互斥量(mutex)、条件变量(condition_variable)等。`p&c.cpp`文件可能就是这样一个实现示例,它通过控制并发访问来防止数据竞争和死锁。 1. **互斥量*...

    Qt C++11 生产者消费者模式类

    生产者消费者模式是一种多线程同步的经典设计模式,它在多线程编程中扮演着重要的角色,用于协调生产数据和消费数据的两个并发过程。在本项目“Qt C++11 生产者消费者模式类”中,我们看到利用Qt框架和C++11的新特性...

    java多线程_消费者与生产者模型

    在Java多线程编程中,消费者-生产者模型是一种经典的线程间通信模式,用于解决多线程环境下的数据共享问题。该模型涉及到两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责创建数据,而消费者则...

    12.2 Qt5多线程:使用QWaitCondition实现生产者和消费者

    总的来说,QWaitCondition是Qt5多线程编程中用于线程间通信和同步的强大工具,尤其在处理生产者-消费者问题时。通过熟练运用QWaitCondition,开发者可以构建出高效、稳定、响应迅速的应用程序。

Global site tag (gtag.js) - Google Analytics