最新新闻:

仓库存储100个产品生产者线程:判断仓库是否满了

时间:2022-09-05 14:01:43来源:网络整理

问题介绍:

仓库存放 100 种产品

生产者线程

判断仓库是否满了,如果满了,等待——(仓库有位置)

如果仓库未满,

将生产的产品放入仓库----1个仓库有一个产品cpu没了

输出仓库中的产品数量----3,应该输出数量1,但此时仓库数量为0

通知仓库有产品

消费者线程:

判断仓库是否为空,如果为空,等待-(仓库中有产品)

如果仓库是空的,

从仓库取出一个产品-------- 2 仓库没有产品c#生产消费者问题,cpu去

输出仓库中的产品数量

通知仓库位置

问题分析:

对于生产者,执行1,cpu时间片到达,

消费者线程开始执行直到2,cpu时间片到达

生产者线程开始执行,输出仓库数为0,显然与现实不符。刚刚放入的产品数量不能为0。

解决方案:

生产者和消费者必须同步访问存储库。也就是说c#生产消费者问题,在生产者访问仓库的过程中,如果没有结束,消费者就无法访问仓库,否则容易出现上述问题。

//消费者
package Day20;
public class Consumer extends Thread{
	public void run() {
		while (true) {
			synchronized (PandCTest.lock) {
				if (PandCTest.cangku.size()==0) {
					try {
						PandCTest.lock.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}else {
					PandCTest.cangku.remove(0);
					System.out.println("remove noe is: "+PandCTest.cangku.size());
					PandCTest.lock.notify();
				}
			}
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

//生产者
package Day20;
public class Producer extends Thread{
	public void run() {
		while (true) {
			synchronized (PandCTest.lock) {
				if (PandCTest.cangku.size()==PandCTest.MAX_NUM) {
					try {
						PandCTest.lock.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}else {
					PandCTest.cangku.add("cp");
					System.out.println("add now is: "+PandCTest.cangku.size());
					PandCTest.lock.notify();
				}
			}
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

package Day20;
import java.util.ArrayList;
import java.util.List;
public class PandCTest {
	public static final int MAX_NUM=50;
	public static final Object lock = new Object();
	public static List<String> cangku = new ArrayList<String>();
	public static void main(String[] args) {
		Producer pr = new Producer();
		Consumer co = new Consumer();
		pr.start();
		co.start();
	}
}

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

猜您喜欢

图文推荐

热点排行

精彩文章

热门推荐