produce_cuctomer (生产者-消费者)模式

    一个老问题,一只水杯完成倒水,喝水的动作,保证每次都是先倒水在喝水,

这是一个典型的 生产者-消费者模型,如何解决这样的类型的问题,这就是线程同步下的调度问题

 

这个模式的难点在于线程间的调度,线程建调度的本质也就是线程状态的转换配合synchronized 同步关键字的使用

不同的代码上的使用同一个同步锁达到不同模块之间的协调

   生产线程 执行搜先拿到锁,判断水杯是否有水,没有就生产以后发出信号水杯已有水唤醒消费线程去消费,有的话就阻塞,等待消费以后继续生产

   消费线程 与生产线程相反

 

   锁同步和阻塞概念:

 

   1 同步的前提要首先拿到锁 只要是Object的派生类都可以作为锁,保证锁的唯一性也是同步的关键。

 

         2 然后就是阻塞问题,wait 是锁的方法,wait导致线程阻塞的时候会释放锁,但是必须在synchronized 内部使用,wait 和 notify 是对应的 同一个锁的notify就可以唤醒一个通过锁wait 导致线程阻塞,如果同一个锁的wait导致了

多个线程的阻塞 notify的时候就会随即唤醒一个阻塞的线程 而 sleep 是Thread的方法,sleep导致线程阻塞的时候不会释放锁,当这个锁在其他同步方法就不能运行,因为sleep不释放锁,所以其他的代码快就无法同步方法,应为锁是同步的前提,sleep 是通过设置时间解除阻塞

 

 

   这里

水杯的代码package produce_costomer;

public class Cuper {

	public static boolean isEmpty = true;
	public static Object lock = new Object();

	public void produce() throws InterruptedException {

		synchronized (lock) {
			//每次执行生产的时候首先判断杯子是否有水,如果没有水就执行倒水动作,然后唤醒这个线程阻塞的消费动作,
			//如果有水就阻塞等待消费完以后唤醒继续生产
			if (isEmpty) {
				System.out.println("生产一杯水.....等待消费");
				isEmpty = false;
				lock.notify();

			} else {
				System.out.println("等待消费阻塞中...");
				lock.wait();
				isEmpty = false;
				lock.notify();
			}
		}
	}

	public void costomer() throws InterruptedException {
		synchronized (lock) {
			if (!isEmpty) {
				System.out.println("消费一杯水.....等待生产");
				lock.notify();
				isEmpty = true;
			} else {
				System.out.println("等待生产阻塞中...");
				lock.wait();
				lock.notify();
				isEmpty = true;
			}
		}
	}
}

   生产线程package produce_costomer;

public class ProduceThread extends Thread {
	private Cuper cup;

	public Cuper getCup() {
		return cup;
	}

	public void setCup(Cuper cup) {
		this.cup = cup;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			for (int i = 0; i < 5; i++) {
				System.out.println("p" + i);
				cup.produce();
			}

		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

  消费线程package produce_costomer;

public class CustomerThread extends Thread {
	private Cuper cup;

	public Cuper getCup() {
		return cup;
	}

	public void setCup(Cuper cup) {
		this.cup = cup;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub

		try {
			for (int i = 0; i < 5; i++) {
				System.out.println("c" + i);
				cup.costomer();
			}

		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
 

测试 package produce_costomer;

/**
 * @author ty93
 *
 */

public class client {

	public static void main(String[] args) {
		Cuper cup = new Cuper();
		CustomerThread ct = new CustomerThread();
		ct.setCup(cup);
		ProduceThread pt = new ProduceThread();
		pt.setCup(cup);
		pt.start();
		ct.start();

	}
}
# 高校智慧校园解决方案摘要 智慧校园解决方案是针对高校信息化建设的核心工程,旨在通过物联网技术实现数字化校园的智能化升级。该方案通过融合计算机技术、网络通信技术、数据库技术和IC卡识别技术,初步实现了校园一卡通系统,进而通过人脸识别技术实现了更精准的校园安全管理、生活管理、教务管理和资源管理。 方案包括多个管理系统:智慧校园管理平台、一卡通卡务管理系统、一卡通人脸库管理平台、智能人脸识别消费管理系统、疫情防控管理系统、人脸识别无感识别管理系统、会议签到管理系统、人脸识别通道管理系统和图书馆对接管理系统。这些系统共同构成了智慧校园的信息化基础,通过统一数据库和操作平台,实现了数据共享和信息一致性。 智能人脸识别消费管理系统通过人脸识别终端,在无需接触的情况下快速完成消费支付过程,提升了校园服务效率。疫情防控管理系统利用热成像测温技术、视频智能分析等手段,实现了对校园人员体温监测和疫情信息实时上报,提高了校园公共卫生事件的预防和控制能力。 会议签到管理系统和人脸识别通道管理系统均基于人脸识别技术,实现了会议的快速签到和图书馆等场所的高效通行管理。与图书馆对接管理系统实现了一卡通系统与图书馆管理系统的无缝集成,提升了图书借阅的便捷性。 总体而言,该智慧校园解决方案通过集成的信息化管理系统,提升了校园管理的智能化水平,优化了校园生活体验,增强了校园安全,并提高了教学和科研的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值