博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

多线程学习 生产者和消费者模式

Posted on 2018-08-06 17:14  南国木棉  阅读(111)  评论(0编辑  收藏  举报

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

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

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

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

  下面我们实现单线程生产,单线程消费模式,为了方便,将所有代码写在了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()方法。

 

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