`
ronaldoLY
  • 浏览: 44044 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

生产/消费模型的java实现

阅读更多

         生产者消费者模型,其实就是一个(生产者)负责产生数据,另一个(消费者)负责使用数据,这里的数据就是生产者和消费者共用的资源,为了让生产者和消费者能有序地使用公共资源,需要引入锁(synchronized)的概念----在一段代码中,将那一段需要很多线程共同使用的代码(相当于共享资源)用synchronized关键字定义,相当于给这一段区域进行了加锁,当有线程来操作它时,就会对其加锁,其他的线程在此时若准备操作它只能排队等待,等第一个线程操作完成,锁解除之后,才能操作。

      下面实现的生产消费模型主要是:

       1.仓库中无产品时,生产者开始生产一件放入仓库,通知消费者来取;

       2.消费者从仓库中取出产品后,仓库没有库存,通知生产者去继续生产。

       3.生产者和消费者是两个互不干扰的线程,但是又有一定的联系,联系就是通过仓库这个被锁定的区域实现的。

      4.wait()和notify()方法就是生产者和消费者线程之间的联系,当一方在使用公共资源时,另一方的状态为wait,当这一方使用公共资源完毕后,会notify(通知)等待的一方。

 

生产者代码:

package Producer_customer0123;

import java.util.List;

public class ProducerThread extends Thread {

	private List<Things> thingslist;//产品队列
	int count=0;
	
	public ProducerThread(List<Things> thingslist){
		this.thingslist=thingslist;
	}
	public void run(){
		while(true){
			//休眠2秒
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e1) {
				
				e1.printStackTrace();
			}
			
			synchronized (thingslist) {
				while(thingslist.size()>0){//如果有产品,则等待
					try {
						thingslist.wait();
						
						System.out.println("生产者在等待-------生产者线程");
						
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				while(thingslist.size()==0){//如果没有产品,则生产产品,并且通知消费者
					Things newthing=new Things();
					count++;
					newthing.id=count;
					newthing.name="第"+count+"个产品";
					thingslist.add(newthing);//加入到队列中
					
					thingslist.notify();//通知消费者
					System.out.println("生产者生产了"+count+"号产品-------生产者线程");
				}
			}
		}
	}
}

 

消费者代码:

package Producer_customer0123;

import java.util.List;

public class CustomerThread extends Thread{

	private List<Things> thingslist;

	public CustomerThread(List<Things> thingslist) {
		this.thingslist=thingslist;
	}

	public void run(){
		
		while(true){
			
			synchronized (thingslist) {
				while(thingslist.size()>0){//如果队列中有产品,消费者就取出来
					for(int i=0;i<thingslist.size();i++){
						
						thingslist.remove(i);
						thingslist.notify();
						System.out.println("消费者取出了队列中第"+i+"号产品----消费者线程");
					}
				}
				while(thingslist.size()==0){
					try {
						System.out.println("队列中已没有产品了----消费者线程");
						thingslist.wait();
						
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
	}

}

 

主函数:

package Producer_customer0123;

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

public class Test {

	
	public static void main(String args[]){
		//创建队列
		List<Things> thingslist=new LinkedList<Things>() ;
		
		//启动线程
		ProducerThread producer=new ProducerThread(thingslist);
		CustomerThread customer=new CustomerThread(thingslist);
		producer.start();
		customer.start();
	}

}

 

运行结果如下:

 

 

 

      结论:通过打印会发现生产者线程和消费者线程会按照某一个顺序依次对thingslist进行操作,对比两段线程的代码,会发现,一个很大的不同就是wait()和notify()的时机,生产者和消费者总是相反的,这也正好解释了在同一时刻,thingslist只允许一个线程对他进行操作。

     以上就是我对生产消费模型的一些认识。
 

 

  • 大小: 37.3 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java实现多线程经典模型生产者消费

    java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...

    操作系统生产/消费者java模拟程序

    在上述Java模拟程序中,我们实现了生产者/消费者模型的关键元素:有限的缓冲区、线程同步和信号机制。通过`wait()`和`notifyAll()`方法,生产者和消费者能够正确地协同工作,避免了数据竞争和死锁。这个例子展示了...

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

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

    操作系统:多线程处理生产者消费者,java实现

    基本满足操作系统课上要求,java实现的生产者消费者模型。

    生产者与消费者 java实现

    本主题将深入探讨生产者与消费者模型的Java实现。 生产者与消费者问题的核心是有一个共享资源(例如,一个缓冲区),生产者不断地生产产品并放入缓冲区,而消费者则从缓冲区取出产品进行消费。关键在于确保生产者...

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

    在JAVA中,实现生产者/消费者模型通常涉及到线程的概念。JAVA提供了一套丰富的API来支持多线程编程,这使得开发者能够轻松地构建复杂的并发应用程序。通过结合使用JAVA的线程和同步机制,可以有效地解决生产者/消费...

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...

    java生产者消费者模型

    Java中实现生产者消费者模型通常会用到以下关键概念和技术: 1. **阻塞队列(BlockingQueue)**:这是生产者消费者模型的核心组件,用于存储待消费的数据。Java的`java.util.concurrent`包提供了多种阻塞队列实现,...

    Java多线程实现生产者消费者

    这就是一个基本的Java“生产者-消费者”模型实现。通过这样的设计,我们可以有效地控制生产者和消费者的执行顺序,确保了数据的正确性,并且避免了先消费后生产的情况。在实际应用中,可能需要根据具体需求进行优化...

    生产者消费者问题 Java实现

    在生产者消费者问题的Java实现中,通常会使用一个有界缓冲区来存储数据。这个缓冲区可以用数组或`BlockingQueue`来实现。`BlockingQueue`是一个线程安全的数据结构,它内置了同步机制,可以避免死锁和资源浪费。 ...

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

    3. **生产者消费者模型的实现步骤**: - 创建一个阻塞队列作为共享数据结构。 - 生产者线程负责向队列中添加元素,当队列满时,调用`put()`方法会阻塞生产者。 - 消费者线程负责从队列中移除元素,当队列空时,...

    java实现生产者消费者

    总结,Java实现的生产者消费者模式利用`BlockingQueue`接口来协调生产者和消费者的动作,确保资源的有效管理和合理分配。通过这种方式,我们可以构建高效、稳定且线程安全的并发程序。在`src`文件夹中,可能包含的是...

    java多线程实现生产者和消费者

    `BlockingQueue`接口提供了线程安全的队列,自动处理了等待和唤醒操作,是实现生产者-消费者模型的一种高效方式。 4. **条件变量**:`wait()`, `notify()`和`notifyAll()`是基于条件变量的,它们可以使得线程在特定...

    Java 线程间通信,生产者与消费者模型

    使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)

    Java实现生产者消费者模型

    Java实现生产者消费者模型 生产者消费者模型,是一般面试题都会考的,下面介绍使用ReetrantLock实现 生产者消费者模型。 定义一个ReentrantLock锁,同时new出两个condition,一个控制队满,一个 控制队空 //生产者 ...

    生产者消费者问题java

    下面是一个简单的生产者消费者问题的Java实现: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerProblem { public static void main(String[] args) { ...

    生产者消费者 java

    ### 生产者消费者模型在Java中的实现 #### 概述 生产者消费者模型是一种经典的多线程编程模式,被广泛应用于解决并发环境下的数据生产和消费问题。在这个模型中,“生产者”负责创建数据并将其放入缓冲区(通常是...

    自己用Java写的简单生产者与消费者模型

    在Java中实现生产者-消费者模型时,通常会用到`java.lang.Thread`类或`java.util.concurrent.ExecutorService`接口来创建和管理线程,同时利用`synchronized`关键字、`wait()`、`notify()`或`notifyAll()`方法来实现...

    操作系统生产者与消费者问题Java简单模拟实现

    在这个Java实现中,我们将深入理解这个问题的背景、原理以及如何通过Java的并发工具来解决。 生产者-消费者问题的基本场景是:有一个共享资源(如一个缓冲区),生产者线程负责往这个缓冲区填入数据,而消费者线程...

    生产者与消费者java实现源代码

    以下是对生产者-消费者问题及其Java实现的详细解析: 1. **生产者-消费者模型**: - **生产者**:负责生产数据并将其放入一个共享的数据缓冲区。 - **消费者**:从共享缓冲区中取出数据并进行处理。 - **缓冲区*...

Global site tag (gtag.js) - Google Analytics