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

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实现线程间同步与互斥生产者消费者问题

    本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能

    Java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) ...

    java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    设计要求:1)每个生产者和消费者对有界缓冲区进行操作后,实时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者的标识符。2)生产者和消费者各有两个以上。3)多个生产者或多个消费者之间须有共享的对缓冲区...

    Java多线程生产者消费者模式实现过程解析

    主要介绍了Java多线程生产者消费者模式实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

    用java为源代码,解决多线程编程中的经典问题:生产者消费者问题

    操作系统课程设计——模拟生产者与消费者(java)

    在生产者---消费者问题中应注意(信号量名称以多个生产者和多个消费者中的为例):首先,在每个程序中用于互斥的wait(mutex)和signal(mutex)必须成对出现;其次,对资源信号量empty和full的wait和signal操作,同样...

    java实验实验报告 add 实验一:多线程/2.Runnable接口. 实验八:JDBC数据库编程二-存储过程

    重命名 实验三多:线程同步与协作:生产者与消费者 为 实验三:多线程同步与协作:生产者与消费者 实验九:使用jdbc存取大文本 add 实验九:使用jdbc存取大文本. 实验二:多线程打字游戏 add 实验二:多线程...

    Java高手真经(编程基础卷)光盘全部源码 免积分

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...

    java并发编程理论基础精讲

    本资源为您提供了关于 Java 并发编程理论基础的精讲,涵盖了多线程编程的核心概念、基本原理以及在 Java 中的应用。通过深入学习,您将建立坚实的并发编程基础,能够更好地理解和应对多线程编程中的挑战。 并发编程...

    Java线程间同步互斥

    本例将模仿经典的线程同步互斥例子——生产者和消费者问题,来演示  java 强大的多线程机制。生产者和消费者共享一个数据,当数据为0 时,消费者不可访问,生产者可访问数据,每次访问数据加1;当数据到达100 时,...

    Java高手真经(编程基础卷)光盘全部源码

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip 16....

    生产者-消费者JAVA程序

    生产者消费者问题是典型的多线程编程例子,这个程序也是多线程编程必须经历的程序。希望对大家有说帮助。

    Java并发编程实战

    5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...

    Java课程设计报告书

    2. 进一步熟悉掌握Java程序设计语言的基础内容,如用户图形界面设计、Java多线程编程、Applet程序的设计、文件和网络输入输出流编程、Java数据库编程等。 3. 通过亲自动手写程序,一方面拓展知识面,一方面...

    09 使用多线程实现分工、解耦、缓冲—生产者、消费者实战.pdf

    Java并发编程学习宝典(漫画版),Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习...

    Java优化编程(第2版)

    9.5 优化消息目的地destination及消息生产者与消费者 9.6 优化消息对象及合理使用事务机制 9.7 影响jms性能的其他因素 小结 …… 第12章 java多线程技术与应用性能优化 12.1 java多线程技术 12.1.1 进程与线程 ...

Global site tag (gtag.js) - Google Analytics