zoukankan      html  css  js  c++  java
  • 多线程学习 生产者和消费者模式

      在并发编程中,使用生产者和消费者能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作恩能够力来提高程序整体处理数据的速度。

      什么是生产者和消费者模式?

      生产者和消费者模式是通过一个容器来解决生产者和消费者强耦合问题。生产者和消费者彼此之间不直接通信。而是通过阻塞队列来进行通信,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,

    消费者不找生产者要数据,而是直接从阻塞队列中取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

      下面我们实现单线程生产,单线程消费模式,为了方便,将所有代码写在了main方法 中。

      

    public class Run {
    
    	public static void main(String[] args) {
    		
    		List list=new ArrayList<>();
    
    		String lock="";
    		
    		//开启生产线程
    		Thread producer =new Thread(new Runnable() {
    			
    			@Override
    			public void run() {
    				while(true){
    					synchronized (lock) {
    						try {
    							if(list.size()>0){
    								lock.wait();
    							}
    							list.add("0");
    							System.out.println("生产者生产了");
    							Thread.sleep(1000);
    							lock.notify();
    						} catch (InterruptedException e) {
    							e.printStackTrace();
    						}
    						
    					}
    				}
    			}
    		},"生产者");
    		//创建一个消费者线程
    		Thread consumer =new Thread(new Runnable() {
    					
    					@Override
    					public void run() {
    						while(true){
    							synchronized (lock) {
    									try {
    										if(list.size()==0){
    											lock.wait();
    										}
    										list.remove(0);
    										System.out.println("消费者消费了");
    										Thread.sleep(1000);
    										lock.notify();
    									} catch (InterruptedException e) {
    										e.printStackTrace();
    									}
    							}
    						}
    					}
    				},"消费者");
    		
    		producer.start();
    		consumer.start();
    		
    	}
    
    }
    

      

      可以发现,生产消费不断的执行。

      生产,消费模式是最经典的等待通知模式。使用了notify()和wait()方法实现了线程之间的通信。但是此种可能导致假死现象,解决办法是使用notifyAll()方法。

      每一个优秀的人,都有一段沉默的时光。不抱怨,不诉苦,最后度过那段感动自己的日子。

  • 相关阅读:
    [置顶] Django 微信开发(一)——环境搭建
    opencv学习_5 (IplImage的结构)
    HDU 3910 (13.10.31)
    Python源码学习七 .py文件的解释
    Android高效加载大图、多图解决方案,有效避免程序内存溢出现象
    记录cocos2d-html5与cocosd-x jsb中遇到的坑
    【PAT Advanced Level】1011. World Cup Betting (20)
    Linux文件实时同步,可实现一对多
    mahout源码分析之DistributedLanczosSolver(五)Job over
    php引入lucene方法
  • 原文地址:https://www.cnblogs.com/hrlizhi/p/9431384.html
Copyright © 2011-2022 走看看