时间: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();
}
}
}
声明:文章仅代表原作者观点,不代表本站立场;如有侵权、违规,可直接反馈本站,我们将会作修改或删除处理。
图文推荐
2022-09-05 10:10:05
2022-09-05 10:01:40
2022-09-05 10:01:33
2022-09-05 08:10:17
2022-09-04 11:01:51
2022-09-04 08:10:17
热点排行
精彩文章
2022-09-05 09:02:44
2022-09-04 14:02:05
2022-09-04 10:01:54
2022-09-03 14:01:25
2022-09-03 12:01:55
2022-09-03 11:01:37
热门推荐