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()方法。

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

  • 相关阅读:
    decimal赋值
    "errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint: [d0tQ_02368635
    scope.row中属性值展示
    echarts.baidu 官网
    PowerDesigner使用
    解决 office2016 意外的严重错误 不能启动程序
    Jenkins 关闭和重启
    解决 weblogic poi3.9 报错 a different type with name "javax/xml/namespace/QName"
    WINDOWS7 下 xclient 802.1x 客户端 停止运行的解决办法
    前台进程转后台运行
  • 原文地址:https://www.cnblogs.com/hrlizhi/p/9431384.html
Copyright © 2011-2022 走看看