`

Java 生产者消费者实现方式

 
阅读更多
1,使用 同步队列 解决任务协调
2,使用 常规Lock,Condition解析任务协调
3,使用synchronized加锁机制
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

public class ProducerAndConsumer {
	public static void main(String[] args) throws Exception {
		CoinBox box = new CoinBox();
		ExecutorService exec = Executors.newCachedThreadPool();
		exec.execute(new Consumer(box));
		exec.execute(new Producer(box));
		
		TimeUnit.MILLISECONDS.sleep(1);
		exec.shutdownNow();
	}
}

class Coin {
	private final int id;

	public Coin(int idn) {
		id = idn;
	}
	@Override
	public String toString() {
		return "Coin [id=" + id + "]";
	}

}

class CoinBox  {
	LinkedBlockingQueue<Coin> box = new LinkedBlockingQueue<Coin>();
	
	public void producess(Coin coin){
		box.add(coin);
		System.out.println("投入硬币:" + coin);
	}
	public void consumer(){
		try {
//			Coin coin = box.take();
			Coin coin = box.poll();
			if(coin == null){
				System.err.println("拿走硬币:" + coin);
			}else{
				System.out.println("拿走硬币:" + coin);
			}
		} catch (Exception e) {
			System.err.println("consumer exception");
		}
	}
	
}

class Consumer implements Runnable {
	private CoinBox box;

	public Consumer(CoinBox box) {
		this.box = box;
	}

	@Override
	public void run() {
		while(!Thread.interrupted()){
			box.consumer();
		}
	}
}

class Producer implements Runnable {
	private CoinBox box;
	private Random rand = new Random(47);

	public Producer(CoinBox box) {
		this.box = box;
	}

	@Override
	public void run() {
		while(!Thread.interrupted()){
			Coin coin = new Coin(rand.nextInt(500));
			box.producess(coin);
		}
	}
}


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ProducerConsumerImpl {
	public static void main(String[] args) {
		Store store = new Store();

		ExecutorService proConServiceExecutor = Executors.newFixedThreadPool(2);
		Producer1 producer = new Producer1(store);
		Consumer1 consumer = new Consumer1(store);

		try {
			proConServiceExecutor.execute(producer);
			proConServiceExecutor.execute(consumer);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			proConServiceExecutor.shutdown();
		}
	}
}

class Store {

	private Lock producerConsumberLock;
	private Condition producerCondition;
	private Condition consumerCondition;

	private final int POOL_SIZE = 2;
	private int productNumber;
	private int[] productPool;

	public Store() {
		productPool = new int[POOL_SIZE];
		productNumber = 0;

		producerConsumberLock = new ReentrantLock();
		producerCondition = producerConsumberLock.newCondition();
		consumerCondition = producerConsumberLock.newCondition();
	}

	public void produce() {
		try {
			while (productNumber >= POOL_SIZE) {
				System.out.println("productNumber=" + productNumber);
				System.out.println("Pool is full, producer " + Thread.currentThread().getName() + " wait...");
				producerCondition.await();
			}

			producerConsumberLock.lock();
			productPool[productNumber++] = 1;
			System.out.println(Thread.currentThread().getName() + " Porduced a product....");

			if (productNumber > 0) {
				consumerCondition.signalAll();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			producerConsumberLock.unlock();
		}

	}

	public void consume() {
		try {
			while (productNumber <= 0) {
				System.out.println("productNumber=" + productNumber);
				System.out.println("Pool is empty, consumer " + Thread.currentThread().getName() + " wait...");
				consumerCondition.await();
			}

			producerConsumberLock.lock();
			productNumber--;
			System.out.println(Thread.currentThread().getName() + " Consumed a product....");
			if (productNumber <= POOL_SIZE - 1 && productNumber >= 0) {
				producerCondition.signalAll();
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			producerConsumberLock.unlock();
		}

	}

}

class Consumer1 implements Runnable {
	private Store pcl;

	public Consumer1(Store pcl) {
		this.pcl = pcl;
	}

	@Override
	public void run() {
		while (true) {
			pcl.consume();
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

}

class Producer1 implements Runnable {
	private Store pcl;

	public Producer1(Store pcl) {
		this.pcl = pcl;
	}
	@Override
	public void run() {
		while (true) {
			pcl.produce();
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

}


public class PiggyMoney {
	public static void main(String[] args) throws InterruptedException {
		Bank bank = new Bank();
		ExecutorService exec = Executors.newCachedThreadPool();
		exec.execute(new CoinIn(bank));
		exec.execute(new CoinOut(bank));

		TimeUnit.MILLISECONDS.sleep(3);
		List results = exec.shutdownNow();
		for (Object object : results) {
			System.out.println(object);
		}
	}
}

class Bank {
	private List<Money> bank = new LinkedList<Money>();

	public synchronized void coinIn() {
		try {
			Money money = new Money();
			bank.add(money);
			System.out.println("主淫存入" + money);

			if (bank.size() > 0) {
				notifyAll();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public synchronized void coinOut() {
		try {
			if (bank.size() <= 0) {
				System.err.println("主淫,您不能透支啊....");
				wait();
			}

			Money money = bank.get(0);
			bank.remove(money);
			System.out.println("主淫取出" + money);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

class CoinOut implements Runnable {
	private Bank bank;

	public CoinOut(Bank bank) {
		this.bank = bank;
	}

	@Override
	public void run() {
		while (!Thread.interrupted()) {
			bank.coinOut();
		}
	}
}

class CoinIn implements Runnable {
	private Bank bank;

	public CoinIn(Bank bank) {
		this.bank = bank;
	}

	@Override
	public void run() {
		while (!Thread.interrupted()) {
			bank.coinIn();
		}
	}
}

class Money {
	private int id = counter++;
	private static int counter = 1;

	@Override
	public String toString() {
		return "Money [id=" + id + "]";
	}

}
分享到:
评论

相关推荐

    java实现生产者消费者

    在Java中,`java.util.concurrent`包下的`BlockingQueue`接口提供了一种线程安全的数据结构,非常适合用于实现生产者消费者模式。生产者将产品放入队列,消费者从队列中取出产品。`BlockingQueue`提供了`put()`和`...

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

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

    java生产者消费者问题

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

    java生产者消费者

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

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

    本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...

    生产者与消费者 java实现

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

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

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

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

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

    java生产者消费者demo

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

    多线程简易实现生产者消费者模式

    总之,生产者消费者模式是多线程编程中的一种重要设计模式,它通过信号量和条件变量实现了线程间的同步和通信,有效提高了系统资源的利用率和整体效率。在Java中,我们可以借助并发库轻松实现这一模式,使得代码更加...

    Java 生产者消费者模式

    总之,生产者消费者模式和中介者设计模式的结合是解决并发问题的一种有效方式,它可以帮助我们构建更加灵活、可维护的系统。通过阅读你提供的`consumption`代码,我们可以深入理解这些概念在实际项目中的应用。

    生产者消费者问题 Java实现

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

    生产者消费者java实现

    详细的生产者消费者的java实现过程,详细的生产者消费者的java实现过程,详细的生产者消费者的java实现过程

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

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

    java 生产者消费者演示程序

    在这个示例程序中,我们使用了Java语言实现了生产者消费者模型。我们首先创建了一个 GoodsBuffer 对象,该对象充当缓冲区的角色。然后,我们创建了两个生产者对象(Producer),并将其优先级设置为10,这是最高的...

    Java生产者与消费者

    下面我们将详细讲解如何在Java中实现生产者与消费者: 1. **定义缓冲区** 缓冲区是生产者与消费者之间共享的数据结构,通常是一个固定大小的数组。例如: ```java class Buffer { private int[] items = new ...

    生产者 消费者 进程 可视化 java

    在Java编程中,"生产者-消费者"模型是一种常见的多线程问题,它涉及到进程间的同步与通信。在这个模型中,生产者线程负责生成数据并放入缓冲区,而消费者线程则负责从缓冲区取出数据进行处理。这里的"车库"例子就是...

    java生产者消费者模型

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

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

    总的来说,"操作系统生产者与消费者问题Java简单模拟实现"这个项目提供了一个直观的多线程编程实例,帮助我们理解和实践Java中的线程同步技术,这对于理解和解决实际并发问题具有重要意义。通过分析这个项目,我们...

    生产者消费者问题 Java

    总之,这个项目通过Java的多线程和`BlockingQueue`,实现了生产者消费者问题的直观演示,无论是在GUI界面还是命令行环境中都能运行。对于学习Java并发编程和理解线程同步机制的人来说,这是一个非常有价值的实践案例...

Global site tag (gtag.js) - Google Analytics