对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一样,Hello World!都是最经典的例子。
实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了,利用前面说过的堵塞栈实现该模式异常简洁。
对于此模型,应该明确一下几点:
1、生产者仅仅在仓储未满时候生产,仓满则停止生产。
2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。
3、当消费者发现仓储没产品可消费时候会通知生产者生产。
4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。
测试代码:
/** * java多线程模拟生产者消费者问题 * * ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品,Storage仓库 * * @author 吖大哥 */ public class ProducerConsumer { public static void main(String[] args) { ProducerConsumer pc = new ProducerConsumer(); Storage s = pc.new Storage(); ExecutorService service = Executors.newCachedThreadPool(); Producer p1 = pc.new Producer("张三", s); Producer p2 = pc.new Producer("李四", s); Consumer c1 = pc.new Consumer("王五", s); Consumer c2 = pc.new Consumer("老刘", s); Consumer c3 = pc.new Consumer("老林", s); service.submit(p1); // service.submit(p2); service.submit(c1); service.submit(c2); service.submit(c3); } // 消费者 class Consumer implements Runnable { private String name; private Storage s = null; public Consumer(String name, Storage s) { this.name = name; this.s = s; } public void run() { try { while (true) { System.out.println(name + "准备消费产品……"); Product product = s.pop(); System.out.println(name + "已消费(" + product + ")"); System.out.println("==============="); Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } } // 生产者 class Producer implements Runnable { private String name; private Storage s = null; public Producer(String name, Storage s) { this.name = name; this.s = s; } public void run() { try { while (true) { Product product = new Product((int) (Math.random() * 10000)); // 产生0~9999随机整数 System.out.println(name + "准备生产(" + product + ")……"); s.push(product); System.out.println(name + "已生产(" + product + ")"); System.out.println("==============="); Thread.sleep(500); } } catch (InterruptedException e1) { e1.printStackTrace(); } } } // 仓库,用来存放产品 public class Storage { BlockingQueue<Product> queues = new LinkedBlockingQueue<Product>(10); // 生产 public void push(Product p) throws InterruptedException { queues.put(p); } // 消费 public Product pop() throws InterruptedException { return queues.take(); } } // 产品 public class Product { private int id; public Product(int id) { this.id = id; } public String toString() {// 重写toString方法 return "产品:" + this.id; } } }
相关推荐
1. 同步机制:为了解决多线程并发访问共享资源导致的数据不一致问题,Java提供了synchronized关键字、Lock接口(如ReentrantLock)以及相关的并发工具类。 2. synchronized:用于修饰方法或代码块,实现互斥访问。...
8. **并发设计模式**:笔记可能还会涉及一些经典的并发设计模式,如生产者-消费者模式、读写锁策略、双检锁/双重校验锁定(DCL)等。 9. **JVM内存模型**:Java内存模型(JMM)是理解并发行为的基础,笔记会解释其工作...
生产者消费者模型是常见的多线程协作模式,通过`BlockingQueue`等工具实现线程间的通信和同步。死锁是指两个或更多线程相互等待对方释放资源而无法继续执行的情况,应避免创建这样的循环等待。线程之间的数据传递...
- 生产者-消费者问题:一个线程生产数据,另一个线程消费数据,需要避免生产者过度生产或消费者提前消费。 - 死锁:两个或更多线程互相等待对方释放资源,导致所有线程都无法继续执行。 - 管道(Pipe)和缓冲区...
9. **并发模式**:包括生产者消费者模型、读写者模型、工作窃取等,这些模式有助于优化并发程序的性能。 10. **JVM内存模型**:理解Java内存模型(JMM)对于理解并发编程中的可见性和一致性至关重要。JMM规定了线程...
#### 五、Java多线程学习笔记 ##### 1. 线程类 - **Thread类**: - 提供了创建和控制线程的方法。 - 可以通过继承`Thread`类或实现`Runnable`接口来创建线程。 ##### 2. 等待一个线程的结束 - **join()方法**: -...
JAVA并发编程实践-构建执行程序块-学习笔记是指在JAVA编程语言中,使用多线程、并发编程来实现高效、可靠的程序执行。在构建执行程序块时,需要注意线程安全问题,使用同步机制、并发容器、阻塞队列等来确保线程安全...
- **BlockingQueue**:队列接口,常用于生产者消费者模型,如ArrayBlockingQueue、LinkedBlockingQueue等。 - **CountDownLatch/CyclicBarrier/Semaphore**:高级并发工具类,用于协调多线程之间的协作。 5. **...
总的来说,JUC学习笔记涵盖了Java多线程编程的主要方面,包括线程的创建与管理、同步机制、并发容器以及协调工具的使用,这些都是提升Java并发编程能力的关键知识点。通过深入理解和熟练应用这些工具,开发者可以更...
也可能包含多线程的实战,比如生产者消费者模型等。这些案例旨在帮助学习者通过实践加深理解,提高编程能力。建议按照案例的指导逐步学习,遇到问题时查阅相关文档或在线资源,以期全面掌握Java编程。
这篇“Java线程编程学习笔记(二)”很可能是对Java并发编程深入探讨的一部分,特别是涉及多线程示例的实践应用。我们将从标题、描述以及标签来推测可能涵盖的知识点,并结合"Multi-Threads Demo"这一压缩包文件名来...
6. **支持多线程**:Java内置了对多线程的支持,可以轻松地编写并发执行的程序。 #### 四、Java与编译型语言 Java虽然通常被视为解释型语言,但实际上它结合了编译和解释两种方式。Java源代码先被编译成字节码,...
最后,为了实现高并发,还需要掌握一些常用的并发工具和设计模式,例如并发集合、原子类、线程池、Future模式、生产者-消费者模式、读写锁模式等。使用这些工具和模式,可以有效地提高系统的性能和吞吐量,实现对...
"concurrentTang"项目显然是一个专注于Java多线程与高并发学习的资源集合,其中包含了作者的学习笔记和相关代码示例。通过这个项目,开发者可以深入理解并掌握Java在并发环境下的编程技巧。 Java多线程允许程序同时...
5. **线程通信**:wait()、notify()、notifyAll()方法的使用,以及在生产者消费者模型、哲学家就餐问题等经典示例中的应用。 6. **线程池**:ExecutorService、ThreadPoolExecutor和Future接口的理解,线程池的配置...
8. **并发模式**:包括生产者消费者模型、读者写者模型、菲尼克斯柱子(Fork/Join框架)等,这些都是解决并发问题的经典设计模式。 9. **并发异常处理**:线程间的异常处理需要注意,一旦一个线程抛出未捕获异常,...
生产者-消费者模式 中断的处理策略 传递InterruptedException 恢复中断,让更高层的代码处理 PriorityQueue(非并发) ConcurrentSkipListMap 替代同步的SortedMap ...
生产者消费者模式是一种典型的线程同步场景,其中生产者线程负责生成数据,消费者线程负责消耗数据。生产者在数据准备好后通知消费者,消费者在数据未准备好时等待。这种模式通常借助于BlockingQueue(阻塞队列)来...
- 生产者-消费者模型的优点:解耦生产者与消费者。 - **线程生命周期** - 线程的状态:NEW、RUNNABLE、BLOCKED等。 - 线程状态转换图。 #### 第十章:泛型 - **泛型入门** - 泛型的概念:提高代码的可重用性和...
- `BlockingQueue`:阻塞队列,常用于生产者消费者模型,了解`ArrayBlockingQueue`、`LinkedBlockingQueue`等实现。 4. **并发工具** - `CountDownLatch`:一次性计数器,常用于多线程启动同步。 - `...