生产、消费模型

生产、消费模型:

一、生产、消费模型:

  在线程间通讯的时候,当在一个对象上调用wait()方法时,当前线程就会进入wait状态,直到收到另一个对象的notify()发出通知,才会执行下一部计算,而且线程在wait的时候,也可能被中断,这就是"生产/消费模型"

 

二、简单实现:

 1.生产和消费线程用来操作的对象:

 

package 生产_消费模型;
/**
 * 用来交换的数据对象模型
 * @author Administrator
 *
 */
public class Student {

	int id;
	String name;
	
	public String toString(){
			
		return id+"<>"+name;
	}
	
}

 

 

 2.生产线程:

 

package 生产_消费模型;

import java.util.List;

public class ProduceThread extends Thread {

	//与消费线程或以共同存取的对象列表
	private List shareList;
	
	//用来标记的放入对象的每一个独立的编号
	private static int count;
	
	//构造器参数是生产线程要放入数据的队列
	public ProduceThread(List shareList){
	    this.shareList = shareList;	
	}
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//super.run();
		System.out.println("生产线程已经启动:"+shareList.size());
		while(true){
			try {
				Thread.sleep(2000);
				
				synchronized (shareList) {
					
					while(shareList.size()>0){
						shareList.wait();
					}
					
					while(shareList.size()==0){
						
						Student st = new Student();
						count++;
						st.id = count;
						st.name="对象"+count;
						
					System.out.println("生产线程放入对象:"+st.toString());	
						
						shareList.add(st);
						shareList.notify();
					}
					
				}
				
				
				
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			

		}
	}
}

 

 

    通过构造函数把操作对象的List传进去,如果List里面有对象,就要wait,而当List里面没有对象,该生产线程就要产生一个,并发出notify的通知.并把操作的对象加入操作对象的List

 

 3.消费线程:

package 生产_消费模型;

import java.util.List;

/**
 * 消费线程
 * @author Administrator
 *
 */

public class CustomerThread extends Thread{

	private List shareList;
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//super.run();
		System.out.println("消费线程已经启动:"+shareList.size());
		
		while(true){
			
			synchronized (shareList) {
				
				while (shareList.size()==0) {
				//如果没有,消费线程就要等待
					try {
						shareList.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
				}
				
				while(shareList.size()>0){
					
					System.out.println("消费线程取出:"+shareList.remove(0).toString());
					
					//取出一个后,就发通知
					shareList.notify();
					
				}
				
			}
			
			
		}
	}
	
	public CustomerThread(List shareList){
		
		this.shareList = shareList;
	}
	
}

 

    通过构造函数把操作对象的List传进去,当List里面没有对象时,消费线程也就没什么可以消费的了,就要进入wait状态,当List里面有对象时,消费线程就消费一个,并发出notify的通知。

 

 4.Main:

package 生产_消费模型;

import java.util.LinkedList;
import java.util.List;

/**
 * 主函数
 * @author Administrator
 *
 */
public class Cb123456 {

	public static void main(String[] args) {
		//生产,消费线程交换的队列
		List shareList = new LinkedList();
		
		//启动生产线程
		new ProduceThread(shareList).start();
		
		//启动消费线程
		new CustomerThread(shareList).start();
	}
	
}

 

 

三、运行结果:

 

 

四、结果分析:

 1.Main里面,通过new关键字给LinkedList分配内存空间,同时实例化,但此时的LinkedList里面什么都没有,所以是生产线程先执行的

 2.在控制台可以看见在输出结果的时候,生产线程和消费线程总是同时显示结果的.

 

五、补充:

1.LinkedList:

 


 

2.null和" "

  其中null是表示没有地址.而" "表示是一个字符串,有地址的,但是字符串里面的内容却是空的,null就像没有锅,而" "表示有锅却没有米的

 

六、总结:

  生产消费模型:当集合中没有对象时,生产线程会产生一个,并发出通知,然后消费线程就把它给消费了。

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制问题,并提供完整的Matlab代码实现。文章结合数据驱动方法与Koopman算子理论,利用递归神经网络(RNN)对非线性系统进行建模与线性化处理,从而提升纳米级定位系统的精度与动态响应性能。该方法通过提取系统隐含动态特征,构建近似线性模型,便于后续模型预测控制(MPC)的设计与优化,适用于高精度自动化控制场景。文中还展示了相关实验验证与仿真结果,证明了该方法的有效性先进性。; 适合人群:具备一定控制理论基础Matlab编程能力,从事精密控制、智能制造、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能控制设计;②为非线性系统建模与线性化提供一种结合深度学习与现代控制理论的新思路;③帮助读者掌握Koopman算子、RNN建模与模型预测控制的综合应用。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现流程,重点关注数据预处理、RNN结构设计、Koopman观测矩阵构建及MPC控制器集成等关键环节,并可通过更换实际系统数据进行迁移验证,深化对方法泛化能力的理解。
在Python中,生产消费模型是一种常见的并发模型,在多线程编程里被广泛应用。该模型生产者线程、消费者线程以及一个共享的缓冲区构成。生产者的职责是生成数据并将其放入缓冲区,消费者则负责从缓冲区中取出数据进行处理,能有效解决多线程之间的协作问题,实现高效的资源利用并发处理[^1]。 此模型也是线程模型中的经典问题,生产消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间取走产品。当存储空间为空时,消费者会阻塞;当存储空间满时,生产者会阻塞[^2]。 在Python中实现生产消费模型,例如有给定200个ip地址,可能开放端口为80、443、7001、7002、8000、8080、9000(flask)、9001,以http://ip:port形式访问页面判断是否正常访问的需求。可以先构建所有的url地址并存储到一个数据结构中,再依次判断url地址是否可以成功访问。实现多线程时,可以实例化`threading.Thread`对象,也可以自定义类,继承`threading.Thread`并重写`run`方法来存储任务程序[^3]。 以下是一个简单的Python代码示例来展示生产消费模型: ```python import threading import time import queue # 共享缓冲区 buffer = queue.Queue(maxsize=5) # 生产者线程函数 def producer(): for i in range(10): buffer.put(i) print(f"Produced: {i}") time.sleep(1) # 消费者线程函数 def consumer(): while True: item = buffer.get() print(f"Consumed: {item}") buffer.task_done() time.sleep(2) # 创建生产消费者线程 producer_thread = threading.Thread(target=producer) consumer_thread = threading.Thread(target=consumer) # 启动线程 producer_thread.start() consumer_thread.start() # 等待生产者线程结束 producer_thread.join() # 等待缓冲区中的所有任务完成 buffer.join() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值