public class ProducerAndConsumer { public static void main(String[] args) { Storage storage = new Storage(); Thread producer1 = new Thread(new Producer(storage, "producer1")); Thread producer2 = new Thread(new Producer(storage, "producer2")); Thread producer3 = new Thread(new Producer(storage, "producer3")); Thread consumer1 = new Thread(new Consumer(storage, "Consumer1")); Thread consumer2 = new Thread(new Consumer(storage, "Consumer2")); producer1.start(); producer2.start(); producer3.start(); consumer1.start(); consumer2.start(); } } //仓库 class Storage { private int index = 0; private Product[] products = new Product[20]; public int getSize() { return this.index; } // 生产者往仓库中放入产品 public synchronized void push(Product product) { while (index == products.length) { try { //仓库已满,等待 wait(); } catch (InterruptedException ex) { ex.printStackTrace(); } } //把产品放入仓库 products[index++] = product; System.out.println(product.getProducer() + " 存入了产品 " + product + " ,仓库共有 " + this.index + "个产品!"); //唤醒等待线程 notifyAll(); } // 消费者从仓库中取出产品 public synchronized Product pop(String consumer) { while (index == 0) { try { wait();//仓库空,等待 } catch (InterruptedException ex) { ex.printStackTrace(); } } //从仓库中取产品 Product product = products[--index]; products[index] = null; System.out.println(consumer + " 消费了产品 " + product + " ,仓库共有 " + this.index + "个产品!"); //唤醒等待线程 notifyAll(); return product; } } //产品类 class Product { private long id;// 产品id private String producer;// 生产者 public Product(long id, String producer) { this.id = id; this.producer = producer; System.out.println(this.producer + "生产了产品:" + this.id); } public long getId() { return this.id; } public String getProducer() { return this.producer; } @Override public String toString() { return "(产品ID:" + this.id + " 生产者:" + this.producer + ")"; } } //生产者 class Producer extends Thread { private Storage storage; public Producer(Storage storage, String name) { super(name); this.storage = storage; } @Override public void run() { while (true) { storage.push(new Product(new java.util.Date().getTime(), super.getName())); try { Thread.sleep(100); } catch (InterruptedException ex) { ex.printStackTrace(); } } } } //消费者 class Consumer extends Thread { private Storage storage; public Consumer(Storage storage, String name) { super(name); this.storage = storage; } @Override public void run() { while (true) { storage.pop(super.getName()); try { Thread.sleep(100); } catch (InterruptedException ex) { ex.printStackTrace(); } } } }
* 多线程同步 synchronized方法和代码块:每个对象都有一个锁,当线程进入对象的synchronized方法或
代码块时,该线程获得对象的锁,其他线程在访问该对象的任何synchronized方法或代码块时无法获得
锁被挂起等待。对象的其他非synchronized方法不受锁的影响。
* static synchronized方法的锁对象是ClassName.class。
相关推荐
生产者和消费者线程都需要有自己的业务逻辑,这可以通过重写`run()`方法实现。 2. **共享资源**:在生产者-消费者模型中,通常会有一个固定大小的缓冲区作为共享资源。可以使用数组或链表实现,但需要注意的是,当...
通过这样的设计,我们可以有效地控制生产者和消费者的执行顺序,确保了数据的正确性,并且避免了先消费后生产的情况。在实际应用中,可能需要根据具体需求进行优化,例如添加异常处理、使用更高级的同步工具(如`...
生产者和消费者可以分别绑定到不同的条件变量上,从而实现更加灵活的控制。 6. **死锁与活锁**:在实现生产者消费者模式时,需要警惕死锁和活锁的情况。死锁是指两个或多个线程相互等待对方释放资源,导致无法继续...
《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...
生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则负责消费这些数据。关键在于,生产者不应在没有消费者准备接收的情况下生成数据,同时消费...
《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...
《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...
在Java中,我们可以利用同步机制来实现这种关系,确保生产者和消费者之间正确、有序地交互。 首先,理解生产者消费者模型的核心概念。生产者将产品放入一个共享的缓冲区,而消费者从缓冲区取出产品进行消费。关键...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在本教程中,我们将深入探讨Java中的多线程设计模式、并发核心编程概念以及线程池的工作原理和种类。 首先,让我们了解什么...
总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...
1. **缓冲区**:生产者和消费者共享的存储区域,用于存放产品。在Java中,我们可以用数组、ArrayList或LinkedList等数据结构来模拟缓冲区。 2. **信号量(Semaphore)**:用于控制对缓冲区的访问,确保同一时间只有...
Java提供了BlockingQueue接口,实现了线程安全的队列,可以高效地在生产者和消费者之间传递数据。此外,还可以利用并发工具类如Semaphore(信号量)来控制对有限资源的访问,或者使用CountDownLatch来协调多个线程的...
通过以上分析,我们可以看到,生产者/消费者问题不仅是一个理论上的概念,而且在实际的JAVA多线程编程中也有着广泛的应用。通过合理选择和应用JAVA提供的同步机制,可以有效地解决生产者/消费者问题中的同步问题,...
### Java多线程编程经验 #### 一、Java线程:概念与原理 现代操作系统都是多任务操作系统,其中多线程是一种重要的实现多任务的方式。线程是进程内的一个执行单位,一个进程可以包含多个线程。例如,在Java应用...
`BlockingQueue`是一个线程安全的数据结构,它提供了一种在生产者和消费者之间同步的方法,当队列满时,生产者会被阻塞,无法再添加元素;当队列空时,消费者会被阻塞,无法取出元素,这样就确保了数据的一致性和...
队列作为一种缓冲区,避免了生产者和消费者的直接耦合,使得它们可以独立工作,提高系统的并行性。 2. **Java的线程同步机制**: - `wait()`, `notify()` 和 `notifyAll()`:这些方法位于`Object`类中,用于线程间...
生产者和消费者模式是多线程编程中一个经典的设计模式,它主要解决的是在多线程环境下资源的有效利用和同步问题。在这个模式中,生产者负责生成数据,而消费者负责消费这些数据。为了保证生产与消费的平衡以及避免...
而生产者消费者模型是一种设计模式,用于解决资源分配和消耗的问题,它通过共享缓冲区来协调生产者和消费者线程之间的通信。 线程安全主要涉及到以下几个方面: 1. **同步机制**:Java提供了多种同步机制,如`...
在本示例中,“java多线程例子-生产者消费者”旨在展示如何利用多线程来实现生产者和消费者模式。这种模式是并发编程中的经典设计模式,用于协调生产数据和消费数据的两个不同线程。 生产者消费者模式的基本概念是...