Java练习1--模拟某电影院三个售票窗口同时出售电影票,一个售票窗口可进行退票的过程

版权声明:仅供学习使用,未经同意不得转发,不可使用商业用途。 https://blog.csdn.net/wangqingbang/article/details/90739378

面向对象的一个小程序,觉着还不错,记录一下
练习要求:
实验要求:
(一)编写一个程序,程序模拟某电影院三个售票窗口同时出售电影票的过程。
1. 电影票顺序出售,程序模拟显示售票的详细过程(如:“窗口X出售编号XXX电影票”)。
2. 三个窗口同时出票,出票间隔采用随机控制。
3. 不能重复出售相同的电影票。
程序应具有良好的人机交互性能,即:程序应向用户提示功能说明,并可根据用户的功能选择,执行对应的功能,并给出带详细描述信息的最终执行结果。
(二)扩展以上程序, 模拟某电影院三个售票窗口同时出售电影票,一个售票窗口可进行退票的过程。

具体的过程注释都在代码中有标记。
小tips:
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
  3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
  4. 修改一个类,其作用的范围是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();
            }
        }
    }
}

下面是运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wangqingbang/article/details/90739378
今日推荐