版权声明:仅供学习使用,未经同意不得转发,不可使用商业用途。 https://blog.csdn.net/wangqingbang/article/details/90739378
面向对象的一个小程序,觉着还不错,记录一下
练习要求:
实验要求:
(一)编写一个程序,程序模拟某电影院三个售票窗口同时出售电影票的过程。
1. 电影票顺序出售,程序模拟显示售票的详细过程(如:“窗口X出售编号XXX电影票”)。
2. 三个窗口同时出票,出票间隔采用随机控制。
3. 不能重复出售相同的电影票。
程序应具有良好的人机交互性能,即:程序应向用户提示功能说明,并可根据用户的功能选择,执行对应的功能,并给出带详细描述信息的最终执行结果。
(二)扩展以上程序, 模拟某电影院三个售票窗口同时出售电影票,一个售票窗口可进行退票的过程。
具体的过程注释都在代码中有标记。
小tips:
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:
- 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
- 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
- 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
- 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
当两个并发线程(thread1和thread2)访问同一个对象(syncThread)中的synchronized代码块时,在同一时刻只能有一个线程得到执行,另一个线程受阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块。Thread1和thread2是互斥的,因为在执行synchronized代码块时会锁定当前的对象,只有执行完该代码块才能释放该对象锁,下一个线程才能执行并锁定该对象。
下面是具体代码(可执行核心代码):
如果想要继续丰富界面,加上互动即可
/**
* 1.为了使电影票顺序出票且不重复,使用了同步锁保证电影票的同时而且按顺序输出
* 2.为了使出票间隔随机控制,我使用了随机函数,生成随机时间(范围是0到1秒)
* @author QingBang.Wang
* @DATE 2019/5/30
*/
public class Ticket{
public static void main(String[] args) {
/**
* 实例化线程对象
*/
Station station1 = new Station("窗口一");
Station station2 = new Station("窗口二");
Station station3 = new Station("窗口三");
/**
* 开始运行
*/
station1.start();
station2.start();
station3.start();
}
}
class Station extends Thread {
//设置静态票数
static int ticket = 50;
//设置线程锁
static Object ob = "ThisIsATicket";
//给线程命名
public Station(String name) {
super(name);
}
//写run方法
public void run() {
sell();
}
//售卖方法
public void sell() {
while (ticket > 0) {
synchronized (ob) { //ob相当于一个钥匙
/**
* 使用同步锁控制票
*/
if (ticket > 0) {
//窗口三有二分之一的可能是退票
if (getName().equals("窗口三") && Math.random() > 0.5 && ticket < 50) {
ticket++;
System.out.println("退票第" + ticket + "张票");
} else {
System.out.println(getName() + "卖了第" + ticket + "张票");
ticket--;
}
} else {
System.out.println("很抱歉,票卖完了");
}
}
/**
* 让线程休眠时间随机
*/
try {
sleep((long) (1000 * Math.random()));
} //休息一秒
catch (Exception e) {
e.printStackTrace();
}
}
}
}
下面是运行结果: