`
zhanghaj00
  • 浏览: 64347 次
社区版块
存档分类
最新评论

生产者消费者。看到自己代码联想的

 
阅读更多

   今天看了项目的源码。看到了每个方法都用synchronized 标注的方法,代码也懒得看了,幸好我们用户少,越来越少。。。。不需要那么高的并发。。。
   闲话不多说,早上说了观察者模式。突然想到了是不是可以用生产消费模式。一边做任务,一边处理任务,中间存任务状态,会不会耦合度少点,而且能做到线程安全(后来看了下,没有做到,必须在task 线程里面搞安全。回头多看看多线程和并发的知识)

上代码:

  1.message 类,就是生产者和消费者中间那个东西。一个生产一个消费。。。。。

 

package testProductIssue;

public class Message {

	private String msg;
	
	public Message(String msg){
		
		this.msg = msg;
	}
	
	public String getMsg(){
		return msg;
	}
}

 

   2.生产者:

package testProductIssue;

import java.util.concurrent.BlockingQueue;


public class Product implements Runnable{

	
	private BlockingQueue<Message> que ;
	
	public Product(BlockingQueue<Message> que){
		this.que = que;		
	}
	@Override
	public void run() {
		for(int i=0 ; i <10;i++){
			Message e = new Message("message:"+i);
	        try {
	        	
				que.put(e);
				System.out.println("this is P "+e.getMsg());
				Thread.sleep(1000);
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}	
		}
		Message e = new Message("exit");
		try {
			que.put(e);
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}

	
}

 3.消费者

package testProductIssue;

import java.util.concurrent.BlockingQueue;

public class Custom implements Runnable{

	private BlockingQueue<Message> que;
	
	public Custom(BlockingQueue<Message> que){
		this.que = que;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			Message msg ;
			//这里我看了下BlockingQueue的take方法,调用一次这个方法,这个queue里面的
			//东西就被取走了,所以就直接写在while里面了,这个如果设置成永远等下去,就等于
			//我上一个里面那个wait了。。感觉一个效果。
			while((msg=que.take()).getMsg()!="exit"){
				//先让他休息一下,要不可能那边放上去还没来得及打印到命令行这边就输出了,会造成困扰
				Thread.sleep(2000);
				System.out.println("this is C "+msg.getMsg());	
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 4.测试类

package testProductIssue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TestIssue {
	public static void main(String[] args) throws InterruptedException {
		
		BlockingQueue<Message> msg = new ArrayBlockingQueue<Message>(5);		
		Thread pro = new Thread(new Product(msg));
		Thread cus = new Thread(new Custom(msg));
		pro.start();
		cus.start();
		pro.join();		
	}
}

 

这里的BlockingQueue要说一下,这是concurrent 包下面的一个接口,后面ArrayBlockingQueue是一个实现类,这个有什么特点呢。首先是线程安全的。而且有一个特点就是如果这个queue里面空的,则去操作会处于阻塞状态,如果这个queue是满的,添加操作处于阻塞状态,这里我设置queue的大小是5,下面我吧设置成2的输出到控制台 就能体会到这个阻塞的感觉了。。。

 

this is P message:0
this is P message:1
this is P message:2
this is C message:0 //取出一个数
this is P message:3 //才能放进去一个
this is C message:1 //取出一个
this is P message:4 //才能放进去一个
this is C message:2
this is P message:5
this is C message:3
this is P message:6
this is C message:4
this is P message:7
this is C message:5
this is P message:8
this is C message:6
this is P message:9
this is C message:7
this is C message:8
this is C message:9

 

 

然后 生产者消费者就是这样呀,两个线程 一个生产 一个消费,把东西放到超市(中间的那个queue) 然后各取所需。额貌似就这样,刚刚吃过晚饭,晚上回家继续研究,现在脑子里面啥都没有。。想起来再更新吧。。。。

 

当然,生产者消费者模式还有另一种实现,就是在中间缓存处不使用BlockingQueue 而是用其他的存储单位,这样的话,很容易造成线程不同步的问题,就是我们所说的多线程并发导致的数据不同步了,我网上看了下,可以用volatile关键字来定义容器中中得message,这样存取就不会乱掉。因为volatile是永远从内存中读得。现在想想这个关键字和 threadlocal完全是对立吧,一个是暴力同步内存中得。一个是保存对象副本。分场合来使用这两个东西吧。。。

分享到:
评论

相关推荐

    联想所有机型marker

    6. **购买决策**:消费者在购买二手联想产品时,可以参考这个marker来验证产品的真实性,对比不同机型的性能差异,从而做出更明智的购买决策。 7. **系统恢复**:某些marker可能关联到预装的操作系统和恢复分区,这...

    联想G400电路图a;

    标签“联想G400”明确了讨论的主题,联想G400是一款由联想公司推出的主流消费级笔记本电脑,其硬件配置和设计适用于日常办公、学习和娱乐用途。 压缩包内的文件“Compal VIWGR LA-9631P.pdf”很可能包含了联想G400...

    联想N308主板电路图ZSA00 LA-A751P

    根据提供的信息,这里涉及的知识点涵盖了联想N308一体机主板电路图的详细描述...这份电路图对于技术支持人员以及维修人员来说是重要的维修和诊断工具,而对于普通消费者来说,则更多的是了解产品的内部构造和功能特性。

    F103xx固件库样例(汉化版).

    STM32F103xx固件库样例(汉化版)是为STM32初学者精心准备的资源,其基于STM32固件库的2.0版本,提供了全面且易理解的中文注释,有助于快速掌握STM32微控制器的编程技巧。这个汉化版固件库不仅包含了基本的示例代码...

    day020-继承加强和设计模式代码和笔记.rar

    将生产和消费分离(解耦),即创建对象和使用对象的功能分离,便于管理 缺点: 1.扩展性弱,如果添加了新的产品,则需要修改工厂方法 使用场景: 适用于产品数量较少,且不经常改变的情况 ...

    终端与业务问答题.docx

    4. **品牌联想**:消费者通过品牌联想到的相关属性或价值。 #### 二、通信企业体验营销战略制定原则 1. **产品注重个性**:根据消费者的个性化需求定制产品。 2. **情感融入体验**:通过情感连接增强消费者的体验感...

    Lenovo Ideapad Y470 (Compal LA-6881).pdf

    7. **用户定制**:“Custom163”可能指的是一个特定的定制选项或者配置,这表明联想可能提供了多种配置供消费者选择,以满足不同用户的需求。 综合以上信息,联想IdeaPad Y470是一款结合了Intel先进处理器和Compal...

    艺帆精美时尚智能手机网站模板

    公司致力于向消费者提供国际一流性能和品质的电子产品,并立足于中高端市场。2006年被评为高新技术企业,2007年产值已达到数亿元人民币。主要产品有魅族MX3、MX2、MX、M9、M8(MiniOne)手机系列,M6(MiniPlayer)、M3...

    操作系统试题及答案.doc

    - 在生产者-消费者模型中,消费者进程会在没有新数据到达时被阻塞。 - 当生产者进程产生新数据时,会唤醒消费者进程。 4. **无新工作可做**: - 系统进程如果没有新的任务可执行,会被阻塞。 - 当有新的任务...

    aca

    这里的IT应用涵盖了从产品研发的数字化设计到生产过程的自动化控制,再到个性化推荐系统,根据消费者的肤质和喜好提供定制化的护肤方案。 在印刷业,阿拉伯树胶作为胶版印刷的成分,与数字印刷技术并行发展。现代...

    新版Android开发教程.rar

    ANDROID 的推出后可能影响的产业包括移动电信业,软件开发业,手机制造业,在以消费者为核心的状 态 。 对消费者的影响 � 高档手机选择面增加。 � A ndroid 在设计初期就考虑了与现其有业务的融合,改变以往从...

Global site tag (gtag.js) - Google Analytics