最新新闻:

为什么要使用生产者/消费者模式在线程世界里的线程

时间:2022-09-05 11:01:52来源:网络整理

生产者消费者模型

为什么使用生产者/消费者模式

在线程世界中c#生产消费者问题,生产者是生产数据的线程,消费者是消费数据的线程。在多线程开发中,如果生产者处理速度快,消费者处理速度慢,则生产者必须等待消费者处理完毕才能继续生产数据。同理,如果消费者的处理能力大于生产者的处理能力,那么消费者必须等待生产者。为了解决这个生产和消费能力不平衡的问题,有一种生产者和消费者的模式。

生产者/消费者模式优势

1、解耦。因为有一个额外的缓冲区,生产者和消费者并不直接相互调用。很容易想到,如果生产者和消费者的代码发生变化,不会相互影响。这样一来,生产者实际上就变了。消费者和消费者之间的强耦合被释放,变成了生产者和缓冲区/消费者和缓冲区之间的弱耦合。

2、通过平衡生产者和消费者的处理能力来提高数据的整体处理速度,这是生产者/消费者模型最重要的优势之一。如果消费者直接从生产者那里取数据,如果生产者的生产速度很慢,而消费者的消费速度很快,那么消费者就不得不占用CPU时间,在那里白等。在生产者/消费者模型中,生产者和消费者是两个独立的并发实体。生产者只是将生产出来的数据扔到缓冲区中,不需要关心消费者;消费者也是,从缓冲区中去取数据就行了,你不用担心生产者c#生产消费者问题,缓冲区满了就不会生产缓冲区了,

生产者/消费者模式的作用

- 支持并发 - 解耦 - 支持不均匀的繁忙时间

调用wait/notify等方法必须在当前线程对象内部,比如在同步方法中

用例描述

// 存储多个数据的生产者/消费者模型

public class Basket {
	private Object[] arr;
	
	public Basket() {
		arr=new Object[5];
	}
	public synchronized void produce(Object obj) {
		int pos=-1;
		while (true) {
			pos = indexOfNull();
			if (pos == -1)
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			else break;
		}
		System.out.println(Thread.currentThread()+"生产了一个数据:"+obj);
		arr[pos]=obj;
		this.notifyAll();
	}
	public synchronized void consume() {
		int pos=-1;
		while(true) {
			pos=indexOfNonNull();
			if(pos==-1) {
				try {
					this.wait();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}else
				break;
		}
		System.out.println(Thread.currentThread()+"消费了一个数据:"+arr[pos]);
		arr[pos]=null;
		this.notifyAll();
	}
	
	// 是否有空位置,如果有则返回对应下标,如果没有则返回-1
	private synchronized int indexOfNull() {
		int res = -1;
		for (int i = 0; i < arr.length; i++) {
			Object tmp = arr[i];
			if (tmp == null) {
				res = i;
				break;
			}
		}
		return res;
	}
	// 是否有非空位置,如果有则返回对应下标,如果没有则返回-1
		private synchronized int indexOfNonNull() {
			int res = -1;
			for (int i = 0; i < arr.length; i++) {
				Object tmp = arr[i];
				if (tmp != null) {
					res = i;
					break;
				}
			}
			return res;
		}
}

import java.util.Date;
public class Consumer implements Runnable {
	private Basket resource = null;
	public Consumer(Basket resource) {
		this.resource = resource;
	}
	public void run() {
		for (int i = 0; i < 2000; i++) {
			resource.consume();
		}
	}
}

import java.util.Date;
public class Producer implements Runnable {
	private Basket resource = null;
	public Producer(Basket resource) {
		this.resource = resource;
	}
	public void run() {
		for (int i = 0; i < 20; i++) {
			Object obj = new Date();
			resource.produce(obj);
		}
	}
}

public class Test {
	public static void main(String[] args) {
		Basket resource = new Basket();
		for (int i = 0; i < 10; i++) {
			new Thread(new Producer(resource)).start();
			new Thread(new Consumer(resource)).start();
		}
	}
}

声明:文章仅代表原作者观点,不代表本站立场;如有侵权、违规,可直接反馈本站,我们将会作修改或删除处理。

猜您喜欢

图文推荐

热点排行

精彩文章

热门推荐