java多线程中的生产者消费者模式实现线程间的通信

翻译 2017年03月04日 11:21:34


本实例是一个简单的:单生者vs单消费者



1.生产者类:

package p_t_test;

/**
 * wait/notify变形模式:生产者消费者模式实现进程间通信
 * 
 * 生产者
 * @author lxb
 *
 */
public class P {
	
	private String lock;
	public P(String lock){
		this.lock = lock;
	}
	
	public void setValue(){
		
		try{
			synchronized (lock) {
				
				//如果不为空,生产者处于等待状态
				if(!ValueObject.value.equals("")){
					System.out.println("我是消费者,此时缓冲池中有数据,我正在等待这个池没有数据被消费者用,它用完之后,我就放新的数据 ");
					lock.wait();
				}
				
				String value = System.currentTimeMillis() + "_"+System.nanoTime();
				System.out.println("我放的 的值是:"+value);
				lock.notify();
				
			}
		}catch(InterruptedException e){
			e.printStackTrace();
		}
	}

}

2.生产者线程:

package p_t_test;

/**
 * 生产者线程
 * @author lxb
 *
 */
public class ThreadP extends Thread{
	
	private P p;
	
	public ThreadP(P p){
		this.p = p;
	}
	
	public void run(){
		
		//生产者不停的向缓冲池中存放数据
		while(true){
			p.setValue();
		}
	}

}


3.消费者类:

package p_t_test;

/**
 * 消费者类
 * @author lxb
 *
 */
public class C {

	private String lock;
	
	public C(String lock){
		this.lock = lock;
	}
	
	public void getValue(){
		try{
			synchronized (lock) {
				//当没有值可供消费者使用时,使用消费者的线程处于等待状态
				if(ValueObject.value.equals("")){
					System.out.println("我是消费者,你妹生产者为毛还不放值 ,等了半天了,老子急用:");
					lock.wait();
				}
				System.out.println("消费者获取到的值是:"+ValueObject.value);
				
				ValueObject.value = "";	//消费者取完值之后,将当前值置空
				lock.notify();          //唤醒生产者可以向缓冲池中存放数据了
			}
		}catch(InterruptedException e){
			e.printStackTrace();
		}
	}
}


4.消费者线程:

package p_t_test;

/**
 * 消费者线程
 * @author lxb
 *
 */
public class ThreadC extends Thread{

	private C c;
	
	public ThreadC(C c){
		
		this.c = c;
		
	}
	
	public void run(){
		
		/**
		 * 消费者不停的从缓冲池中取数据
		 */
		while(true){
			c.getValue();
		}
	}
}


5.数据缓冲池:
package p_t_test;

public class ValueObject {

	public static String value="";
}

6.测试类:


package p_t_test;

public class TestClient {

	public static void main(String[] args) {

		String lock = new String(""); // 创建对象锁

		P p = new P(lock);

		C r = new C(lock);
		
		ThreadP pThread = new ThreadP(p);
		
		ThreadC cThread = new ThreadC(r);
		
		pThread.start();
		cThread.start();
	}
}




ios 底部拖拉菜单

这个简易 的底部拖拉菜单没什么工作量,这里氷分析了,直接上代码,距离属性没剥离出来,不过很简单,各位大神用到的时候,自己扩展吧 代码如下: @interface ViewContr...

IOS控件系列--优雅的表情键盘设计(扩展性好)

本控件效果如下图所示: 本控件设计的几个原则 : 1.扩展性好,代码不冗余。 2.逻辑清晰。 3.回调接口清晰。 4.移植性好。 首先来讨论下本控件的扩展性: 效果图给出的是3行...

JAVA多线程-线程间通信(二)-生产者/消费者模式实现

二、生产者/消费者模式实现     生产者/消费者模式是等待/唤醒机制的经典案例 1、一生产与一消费:操作值 package org.jksoft.thread.product; import...

Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例

1.使用Lock和Condition的意义     JDK1.5中提供了多线程升级的解决方案。     1.将同步synchronized替换成现实Lock操作。     2.将Object中的wai...

java多线程:线程间的通信-生产者和消费者(三)

在一个程序中,往往会通过多个线程协同来共同完成一项任务,线程间必然需要进行信息的传递,也即是进程间的通信,我们用生产者和消费者的例子来具体分析:          对于生产者和消费者之间的关系,他们都...
  • akkzhjj
  • akkzhjj
  • 2015年08月30日 09:14
  • 1240

java自学笔记————多线程 线程间通信之生产者消费者问题;

线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务 Object中的    notify():唤醒在此对象监视器上等待的单个线程。    notifyAll():唤醒在此对象监视器上等待...

java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)

多线程系列教程: java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(一) java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(二) 本篇我...

Java多线程通信-利用传统的线程通信wait(),notify()方法实现“生产者消费者模式”

想利用传统的线程通信wait(),notify(),notifyAll()方法,必须依赖于同步监听器的存在,也就是说,对于synchronized修饰的同步方法,因为该类的默认实例(this)就是同步...
  • HD1099
  • HD1099
  • 2015年08月05日 20:02
  • 712

黑马程序员------多线程(No.2)(死锁、线程间通信、生产者消费者问题)

死锁   死锁(开发过程中要避免死锁) 同步中嵌套同步。   为了透彻了解死锁,下面写一个死锁程序: class Test implements Runnable{ private boolean ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java多线程中的生产者消费者模式实现线程间的通信
举报原因:
原因补充:

(最多只允许输入30个字)