3.用Thead子类实现车站购票的一个场景(static关键字)

如上图所示,我们这里模拟一下去车站买票的情形:这里有3个柜台同时售票,总共是1000张票,这三个柜台同时买票,但是只能一个柜台卖同一张票,也就是说1号票卖了之后我们就只能买2号票,2号票卖了之后我们只能买3号票!依次类推!直到卖完这1000张票,然后再从头开始卖票!如下代码演示:

package com.bawei.multithread;
//这里模拟售票窗口
public class TicketWindow extends Thread {
	//柜台名称,表示第几个柜台
	private final String name;
	//定义一个变量,模拟最多有这1000张票,这里之所以要用static关键字,主要是因
	//为不想在线程创建对象的时候,每个线程都有一份自己的实例变量,而是想让我们这里所
	//有的线程懂共享同一份数据,也就是只让这个变量初始化一次,所以这里设置为静态变量
	private static final int MAX=1000;
	//给定一个初始化变量,从第一张票开始卖,static同上
	private static  int index =1;

	public TicketWindow(String name) {
		this.name = name;
	}

	@Override
	public void run() {
		while(index <= MAX){
			System.out.println("当前柜台是"+name+", 所售号码是"+(index++));
		}
	}

}

 上面这个类是Thead的子类,模拟售卖票的窗口,这里面控制着唯一资源票,而且这个票是被几个窗口所共享的,所以这里我们定义成了static的!

package com.bawei.multithread;

public class Station {
	public static void main(String[] args) {
		//这里我们创建了三个线程,来模拟3个柜台!
		TicketWindow  ticketWindow1 = new TicketWindow("1号柜台");
		ticketWindow1.start();

		TicketWindow  ticketWindow2 = new TicketWindow("2号柜台");
		ticketWindow2.start();

		TicketWindow  ticketWindow3 = new TicketWindow("3号柜台");
		ticketWindow3.start();
	}
}

 这个类就是车站类,在这个类中我们创建了3个TicketWindow对象,用这三个对象来模拟3个售票窗口同时售票的情形!

注意:这里有一个问题,就是票是static的,是被多个线程对象所共享的,资源是唯一的,但是static修饰变量的生命周期是很长的,因为它不是随着类的消亡而消亡,这个变量一旦被JVM加载到内存中,它是有一个单独的区域来存放这个变量的,它的生命周期比类的生命周期可能还要长!当然这这只是一个粗糙版本的售票系统!我们下面会用代码给大家演示,如何友好的,将线程和业务分离开来的一个方式!

时间: 2024-12-11 13:20:21

3.用Thead子类实现车站购票的一个场景(static关键字)的相关文章

8.python之面相对象part.5(子类调用父类的方法,以及super关键字)

python中子类要调用父类的某个方法,在python早期版本中是这样实现的: class A: def __init__(self): print "enter A" print "leave A" class B(A): def __init__(self): print "enter B" A.__init__(self) print "leave B" b = B() >>>enter B enter

Java 中 父类变量访问子类方法 需要使用 类型转换 (instenceof)关键字 /类型判断/

通过数组元素访问方法的时候只能访问在 Animal中定义的方法,对 于 Tiger类和  Fish中定义的方法时却不能调用,例如语句  animal[2].swim();就是不正确的.当 需要访问这些方法时需要用到类型转换,演示程序如下. 1 public class DynamicMethodDemo2{ 2 public static void main(String args[ ]){ 3 Animal [ ]animal=new Animal[3]; 4 animal[0]=new An

类和接口的区别

类: 类的分类有:抽象类(abstract).密封类(sealed).静态类(static) 抽象类(abstract) 关键字: abstract使用目的:若所有子类拥有共同的特性,可以把这个特性放到一个抽象类中,子类继承此抽象类. 特点: 1.不能被实例化:ClassName en=new ClassName();//这样会报错. 2.抽象成员必须包含在抽象类中. 3.抽象类除了抽象成员外,还可以包含别的成员(不用关键字 abstract). 4.子类继承抽象父类后,必须把父类中的所有抽象成

层的应用

(层)Laye:是处理玩家事件响应的Node子类.与场景不同,层通常包含的是直接在屏幕上呈现的内容,并且可以接受用户的输入事件,包括触摸,加速度计和键盘输入等.我们需要在层中加入精灵,文本标签或者其他游戏元素,并设置游戏元素的属性,比如位置,方向和大小:设置游戏元素的动作等.通常,层中的对象功能类似,耦合较紧,与层中游戏内容相关的逻辑代码也编写在层中,在组织好层后,只需要把层按照顺序添加到场景中就可以显示出来了.要向场景添加层,我们可以使用addChild方法. 可以通过下面的三个类设置层的属性

C++题目上

1)请简述智能指针原理,并实现一个简单的智能指针 智能指针作用:管理别人的指针,主要特点:RAII(Resource Acquisition Is Initialization)资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 注:对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智能指针通过析构函数释放有它管理的堆内存.所有智能指针都重载了"operator->

对各类知识点的回顾

一.初始化 1.对this.super,构造函数,构造代码块,静态代码块总结. this:代表当前对象,也就是所在函数所属对象的引用.this对象后面加.调用的是对象的成员变量和方法.(this.say());this对象后面加(),调用的是本类中对应参数的构造函数. super:代表父类,也就是当前类的父类.使用方式与this类似. 构造函数:用于当对对象初始化时调用的特殊函数,只在执行一次.在构造函数中使用this或者super,必须定义在构造函数的第一行.如果没有用到,那么构造函数的第一句

java 类、方法、代码块修饰式关键字总结

super 关键字 this和super的区别 访问成员的区别 this关键字 this特点 this使用场景 static关键字 例子 访问权限修饰符 特点 总结: 四个修饰符的特点 访问权限修饰符的宽严关系 final关键字 用法 自定义常量 final修饰类 final修饰成员变量 final修饰局部变量 final修饰成员方法 super 关键字 this和super的区别 this代表当前对象,super可以理解为父类对象 既然super理解为一个父类对象,那么super应该可以用访问

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

Win32中安全的子类化(翻译)

关于子类化的话题虽然有些旧,但它至今仍然不失为一种开发Windows的强有力技术,在MFC的内核.甚至.NET的内核中都离不开它,希望本连载能对Windows开发的爱好者有所帮助. 原文标题:Safe Subclassing in Win32作者:Kyle MarshMSDN技术组 点击此处查看原文 摘要 本文描述了Win32环境下的子类化,描述了它是如何工作的以及实现安全的子类化必须要遵循的规则.本文涵盖了实例子类化和全局子类化.而超类化则作为一个全局子类化的可选替代方案被介绍.从Win16到