Toy Program——线程同步。涉及wait(),notifyall(),runnable,toString

本文探讨了并发编程中的生产者消费者模型,通过实现同步栈、SteamedBuns类、Producer类和Consumer类,展示了如何在多线程环境下安全地进行数据生产与消费。
public class TestProducerConsumer {

	public static void main(String[] args) {
		SyncStack ss = new SyncStack();
		Producer pd = new Producer(ss);
		Consumer cs = new Consumer(ss);
		new Thread(pd).start();
		new Thread(pd).start();
		new Thread(pd).start();
		new Thread(cs).start();
		new Thread(cs).start();
	}

}

class SteamedBuns{
	int id = 0;
	SteamedBuns(int id){
		this.id = id;
	}
	public String toString(){
		return "SteamedBuns: " + id;
	}
}

class Producer implements Runnable{
	SyncStack sbsBuffer = null;
	Producer(SyncStack sbsBuffer){
		this.sbsBuffer = sbsBuffer;
	}
	
	public void run(){
		for(int i = 0; i < 20; i++){
			SteamedBuns sbs = new SteamedBuns(i);
			sbsBuffer.putInto(sbs);
			System.out.println("+++Produced+++ " + sbs);
			try{
				Thread.sleep(1000);
			}catch(InterruptedException ie){
				ie.printStackTrace();
			}
		}
	}
}

class Consumer implements Runnable{
	SyncStack sbsBuffer = null;
	Consumer(SyncStack sbsBuffer){
		this.sbsBuffer = sbsBuffer;
	}
	
	public void run(){
		for(int i = 0; i < 20; i++){
			SteamedBuns sbs = sbsBuffer.takeOut();
			System.out.println("--Consumed-- " + sbs);
			try{
				Thread.sleep(1000);
			}catch(InterruptedException ie){
				ie.printStackTrace();
			}
		}
	}
}
class SyncStack{
	int index = 0;
	SteamedBuns[] arrSbs = new SteamedBuns[20];
	
	public synchronized void putInto(SteamedBuns sbs){//线程锁定与唤醒
		while(index == arrSbs.length){
			try{
				this.wait();
			}catch(InterruptedException ie){
				ie.printStackTrace();
			}
		}
		this.notifyAll();
		arrSbs[index] = sbs;
		index++;
	}
	
	public synchronized SteamedBuns takeOut(){//线程锁定与唤醒
		while(index == 0){
			try{
				this.wait();
			}catch(InterruptedException ie){
				ie.printStackTrace();
			}
		}
		this.notifyAll();
		index--;
		return arrSbs[index];
	}
}

当线程需要阻塞式的等待时,则调用wait()。而wait()的同时,锁止权不由线程控制。

sleep()全程hold锁止权。

wait()搭配notify()和notifyAll()使用。

能用Interface的Runnable就不用class的Thread

本资源围绕呼兰河流域边界及数字高程模型(DEM)数据进行系统整理与规范化构建,形成集空间数据、工程文件与制图成果于一体的综合数据集。资源以权威基础地理数据和水文资料为依据,结合地理信息系统(GIS)技术,对呼兰河流域的空间范围与地形特征进行统一表达,为流域水文分析、生态环境研究及区域规划提供可靠的数据基础与技术支撑。在数据内容方面,本资源准确描绘呼兰河流域边界范围,清晰反映流域整体空间形态及其与周边区域的空间关系。同时配套提供覆盖流域范围的 DEM 数据,完整表达区域地形起伏特征与高程分布格局,可支撑坡度、坡向、水系提取、汇流分析等多种基础地形与水文分析应用。在成果形式上,本资源同步提供可编辑的 ArcGIS MXD 工程文件、标准化 Shape 文件(SHP)以及高分辨率标准成图成果(TIF)。其中,MXD 文件已完成流域边界、DEM 图层组织、符号体系设置与制图版式编排,用户可在 ArcGIS 环境中直接进行二次编辑、参数调整与专题扩展;SHP 文件遵循通用 GIS 数据规范,具有良好的兼容性与可移植性,适用于多种 GIS 平台与空间分析场景;TIF 成图成果适合用于成果展示、技术报告及印刷输出。在制图规范与表达方面,成图严格遵循地图制图与水文地理表达规范,合理配置比例尺、指北针、图例及注记系统,突出流域边界轮廓与地形高程分布特征。整体风格科学、清晰,兼顾分析需求与视觉表达效果,可广泛应用于科研论文、项目汇报、规划文本及教学展示等多种场景。总体而言,该资源通过“流域边界数据 + DEM 数据 + 可编辑工程 + 标准成图”的综合形式,实现了呼兰河流域空间与地形信息的系统整合与高质量呈现,为流域水文模拟、生态环境评估以及区域管理决策提供了坚实的数据支撑和可靠的基础资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值