`
jinbingchuan
  • 浏览: 9779 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 生产者消费者

    博客分类:
  • java
 
阅读更多
package com.jin;

import java.util.LinkedList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestMultipleThread {

	public static void main(String[] args) {
		Production shareList = new Production(); 
		ExecutorService executorService = Executors.newFixedThreadPool(6);
		Consume consume1 = new Consume(shareList);
		Consume consume2 = new Consume(shareList);
		Consume consume3 = new Consume(shareList);
		Consume consume4 = new Consume(shareList);
		ProviderP p1 = new ProviderP(shareList);
		ProviderP p2 = new ProviderP(shareList);
		
		executorService.execute(p1);
		executorService.execute(p2);
		executorService.execute(consume2);
		executorService.execute(consume1);
		executorService.execute(consume3);
		//executorService.execute(consume4);
	}
	
	static class Production {
		LinkedList<String> shareList = new LinkedList<String>(); 
		
		public synchronized void take() {
			if (this.shareList.size() > 0) {
				System.out.println("fetch data:" + this.shareList.pollFirst() + ",thread name:" + Thread.currentThread().getName());
				if (this.shareList.size() <40)
				    notify();
			} else {
				try {
					System.out.println("take等待");
					wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
		}
		
		public synchronized void put() {
			if (this.shareList.size() ==100) {
				try {
					System.out.println("put等待");
					wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			} else {
				String data = "" + Math.random();
				System.out.println("put:size:" + this.shareList.size() + "data:" +data +",thread name:" + Thread.currentThread().getName());
				this.shareList.addLast(data);
				notify();
			}
			
		}
	}
	
	static class Consume implements Runnable {
		private Production shareList;
		Consume (Production shareList) {
			this.shareList = shareList;
		}
		public void run() {
			while (true) {
				this.shareList.take();
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			
		}
		
	}
	
	 static class ProviderP implements Runnable{
		private Production shareList;
		ProviderP (Production shareList) {
			this.shareList = shareList;
		}
		public void run() {
			while (true) {
				this.shareList.put();
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
					
			}
			
		}
	}
	
	

}

第二种方式:

package com.jin;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

public class TakeMultipleThread {
    public static void main(String[] a) {
    	BlockingQueue<String> queue = new LinkedBlockingQueue<String>(); 
		ExecutorService executorService = Executors.newFixedThreadPool(6);
		Consumer consume1 = new Consumer(queue);
		Consumer consume2 = new Consumer(queue);
		Consumer consume3 = new Consumer(queue);
		Consumer consume4 = new Consumer(queue);
		Provider p1 = new Provider(queue);
		Provider p2 = new Provider(queue);
		
		executorService.execute(p1);
		executorService.execute(p2);
		executorService.execute(consume2);
		executorService.execute(consume1);
		//executorService.execute(consume3);
		//executorService.execute(consume4);
	}
    
    private static class Provider implements Runnable{

    	private BlockingQueue<String> blockingQueue;
    	
    	Provider (BlockingQueue<String> blockingQueue) {
    		this.blockingQueue = blockingQueue;
    	}
    	
		public void run() {
			while (true) {
				String random = "" + Math.random();
				this.blockingQueue.offer(random);
				System.out.println("put:size:" + this.blockingQueue.size() + "data:" +random +",thread name:" + Thread.currentThread().getName());
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
		}
    	
    }
    
    
    private static class Consumer implements Runnable{

    	private BlockingQueue<String> blockingQueue;
    	
    	Consumer (BlockingQueue<String> blockingQueue) {
    		this.blockingQueue = blockingQueue;
    	}
    	
		public void run() {
			while (true) {
				String random;
				try {
					random = this.blockingQueue.take();
					System.out.println("fetch:size:" + this.blockingQueue.size() + "data:" +random +",thread name:" + Thread.currentThread().getName());
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				try {
					Thread.sleep(230);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			
		}
    	
    }
}
 

 

分享到:
评论

相关推荐

    java生产者消费者

    Java生产者消费者模式是一种多线程设计模式,它在并发编程中被广泛使用,用于解决资源的共享问题。在这个模式中,"生产者"负责创建数据,而"消费者"则负责处理这些数据。它们通过一个共享的数据缓冲区进行通信,避免...

    java生产者消费者问题

    Java生产者消费者问题是多线程编程中的一个经典问题,它主要涉及到线程间的协作与通信。在并发编程中,生产者负责生成数据,而消费者则负责处理这些数据。为了解决生产者和消费者之间的问题,Java提供了一系列的同步...

    java 生产者消费者问题(源码)

    Java生产者消费者问题是多线程编程中的一个经典案例,它主要展示了如何通过共享资源来实现线程间的协作。这个问题源于现实生活中的生产流水线,其中生产者负责制造产品,而消费者负责消耗这些产品。在计算机系统中,...

    java生产者消费者demo

    在这个"java生产者消费者demo"中,开发者使用了适配器模式来构建解决方案。适配器模式是一种设计模式,它允许不同接口的类协同工作,即使它们原本无法直接交互。在生产者消费者问题中,适配器模式可能被用来协调生产...

    java生产者消费者模型

    Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...

    java生产者消费者问题 实验报告

    ### Java生产者消费者问题知识点详解 #### 一、实验背景及意义 生产者-消费者问题是计算机科学中的一个经典问题,通常用于演示并发编程中的同步机制。这个问题涉及到如何在多个线程之间分配有限资源的问题,是多...

    java 生产者消费者演示程序

    Java 生产者消费者演示程序 在这个示例程序中,我们可以看到的是生产者消费者模型的实现。该模型描述了一个生产者和一个消费者之间的关系,生产者生产产品,并将其存储在缓冲区中,而消费者则从缓冲区中消费产品。 ...

    Java生产者消费者模型.rar

    Java生产者消费者模型是多线程编程中的一个经典设计模式,它主要用来解决资源的共享问题,通过协调生产者和消费者之间的工作流程,避免资源的过度消耗或浪费。在这个模型中,生产者负责生成数据,而消费者则负责处理...

    java生产者消费者问题代码实现

    Java 生产者消费者问题代码实现 Java 生产者消费者问题是计算机科学中的一种经典同步问题,它描述了多个生产者和消费者之间的关系,生产者负责生产数据,而消费者负责消费数据。在解决这个问题时,需要使用同步机制...

    Java 生产者消费者模式

    在Java编程中,生产者消费者模式是一种典型的多线程协作模型,用于解决系统资源供需不平衡的问题。这个模式的核心思想是将生产数据和消费数据的过程解耦,使得生产者可以独立地生产数据,而消费者可以独立地消费数据...

    JAVA生产者消费者

    在Java编程中,"生产者消费者"模式是一种经典的多线程问题,用于解决资源的共享与协调。这个模式的核心在于两个角色:生产者和消费者。生产者负责创建资源,而消费者则消耗这些资源。在实际应用中,如数据库连接池、...

    java生产者消费者图形界面模拟

    在Java编程中,"生产者消费者图形界面模拟"是一个经典的多线程问题的实例,它展示了如何通过并发处理来优化资源的使用。这个课程设计基于Java Swing库构建了一个图形用户界面(GUI),用于演示和理解生产者消费者...

    producer-java.rar_java 生产者 消费者_java 生产者消费者_producer.java_生产者 消费者

    在提供的压缩包文件中,`producer.java`可能是实现生产者消费者问题的Java代码示例。通常,这样的代码会包含两个主要类:一个代表生产者,另一个代表消费者。生产者类会有一个或多个方法用于生成数据并将其放入共享...

    Java生产者消费者问题

    在Java编程领域,生产者消费者问题是多线程同步的一个经典示例,它源自并发编程中的一个常见场景。这个问题描述了两个角色:生产者和消费者,它们共享一个有限大小的缓冲区。生产者负责生成数据并将数据放入缓冲区,...

    Rabbitmq的Linux安装以及java生产者消费者demo.pdf

    四、Java生产者消费者demo的实现 RabbitMQ也提供了Java客户端库,可以用来在Java应用程序中实现消息的发送和接收。生产者(Producer)负责发送消息到队列,消费者(Consumer)负责从队列接收消息。 1. 引入RabbitMQ...

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

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

    生产者消费者问题 Java实现

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

    java实现生产者消费者

    在Java编程中,"生产者消费者"模式是一种典型的多线程问题解决模型,它通过共享资源来协调生产者和消费者之间的操作。这个模式的核心在于如何有效地管理资源的生产和消费,以避免生产过快导致资源浪费,或者消费者...

Global site tag (gtag.js) - Google Analytics