`
jaesonchen
  • 浏览: 311665 次
  • 来自: ...
社区版块
存档分类
最新评论

java 多线程编程(生产者和消费者)

 
阅读更多
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。

 

分享到:
评论

相关推荐

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

    生产者和消费者线程都需要有自己的业务逻辑,这可以通过重写`run()`方法实现。 2. **共享资源**:在生产者-消费者模型中,通常会有一个固定大小的缓冲区作为共享资源。可以使用数组或链表实现,但需要注意的是,当...

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

    通过这样的设计,我们可以有效地控制生产者和消费者的执行顺序,确保了数据的正确性,并且避免了先消费后生产的情况。在实际应用中,可能需要根据具体需求进行优化,例如添加异常处理、使用更高级的同步工具(如`...

    java多线程(生产者与消费者)

    生产者和消费者可以分别绑定到不同的条件变量上,从而实现更加灵活的控制。 6. **死锁与活锁**:在实现生产者消费者模式时,需要警惕死锁和活锁的情况。死锁是指两个或多个线程相互等待对方释放资源,导致无法继续...

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

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

    生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则负责消费这些数据。关键在于,生产者不应在没有消费者准备接收的情况下生成数据,同时消费...

    Java多线程编程实战指南-核心篇

    《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    java多线程实现生产者消费者关系

    在Java中,我们可以利用同步机制来实现这种关系,确保生产者和消费者之间正确、有序地交互。 首先,理解生产者消费者模型的核心概念。生产者将产品放入一个共享的缓冲区,而消费者从缓冲区取出产品进行消费。关键...

    java多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在本教程中,我们将深入探讨Java中的多线程设计模式、并发核心编程概念以及线程池的工作原理和种类。 首先,让我们了解什么...

    Java多线程 生产者-消费者模式

    总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...

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

    1. **缓冲区**:生产者和消费者共享的存储区域,用于存放产品。在Java中,我们可以用数组、ArrayList或LinkedList等数据结构来模拟缓冲区。 2. **信号量(Semaphore)**:用于控制对缓冲区的访问,确保同一时间只有...

    Java多线程编程实例

    Java提供了BlockingQueue接口,实现了线程安全的队列,可以高效地在生产者和消费者之间传递数据。此外,还可以利用并发工具类如Semaphore(信号量)来控制对有限资源的访问,或者使用CountDownLatch来协调多个线程的...

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

    通过以上分析,我们可以看到,生产者/消费者问题不仅是一个理论上的概念,而且在实际的JAVA多线程编程中也有着广泛的应用。通过合理选择和应用JAVA提供的同步机制,可以有效地解决生产者/消费者问题中的同步问题,...

    Java多线程编程经验

    ### Java多线程编程经验 #### 一、Java线程:概念与原理 现代操作系统都是多任务操作系统,其中多线程是一种重要的实现多任务的方式。线程是进程内的一个执行单位,一个进程可以包含多个线程。例如,在Java应用...

    java 多线程 生产者消费者模式

    `BlockingQueue`是一个线程安全的数据结构,它提供了一种在生产者和消费者之间同步的方法,当队列满时,生产者会被阻塞,无法再添加元素;当队列空时,消费者会被阻塞,无法取出元素,这样就确保了数据的一致性和...

    java 多线程生产者消费者模型demo

    队列作为一种缓冲区,避免了生产者和消费者的直接耦合,使得它们可以独立工作,提高系统的并行性。 2. **Java的线程同步机制**: - `wait()`, `notify()` 和 `notifyAll()`:这些方法位于`Object`类中,用于线程间...

    生产者和消费者模式多线程

    生产者和消费者模式是多线程编程中一个经典的设计模式,它主要解决的是在多线程环境下资源的有效利用和同步问题。在这个模式中,生产者负责生成数据,而消费者负责消费这些数据。为了保证生产与消费的平衡以及避免...

    java线程安全以及生产者消费者demo

    而生产者消费者模型是一种设计模式,用于解决资源分配和消耗的问题,它通过共享缓冲区来协调生产者和消费者线程之间的通信。 线程安全主要涉及到以下几个方面: 1. **同步机制**:Java提供了多种同步机制,如`...

    java多线程例子-生产者消费者

    在本示例中,“java多线程例子-生产者消费者”旨在展示如何利用多线程来实现生产者和消费者模式。这种模式是并发编程中的经典设计模式,用于协调生产数据和消费数据的两个不同线程。 生产者消费者模式的基本概念是...

Global site tag (gtag.js) - Google Analytics