Java模拟实现机场过安检处理流程

目录
  • 一 场景描述
  • 二 实战
  • 三 测试
  • 四 问题分析
  • 五 说明

一 场景描述

乘飞机时,在进入登机口之前必须经过安全检查,安检口类似于独木桥,每次只能通过一个人,工作人员除了检查你的登机牌外,还有一些其它检查。在此模拟一个非线程安全的安检口类,旅客(线程)分别手持登机牌和身份证接受工作人员的检查。

二 实战

1 FlightSecurity

package concurrent.FlightSecurity;
public class FlightSecurity {
    private int count;
    // 登机牌
    private String boardingPass = "null";
    // 身份证
    private String idCard = "null";
    public void pass(String boardingPass,String idCard){
        this.boardingPass = boardingPass;
        this.idCard = idCard;
        this.count++;
        check();
    }
    private void check() {
        // 简单测试,当登机牌和身份证首字母不相同时则表示检查不通过
        if(boardingPass.charAt(0)!=idCard.charAt(0)){
            throw new RuntimeException("======Excepton======"+toString());
        }
    }
    public String toString(){
        return "The " +count +" paaaenges,boardingPass [" + boardingPass + "],idCard [" + idCard +"]";
    }
}

2 FightSecurityTest

package concurrent.FlightSecurity;
public class FightSecurityTest {
    // 旅客线程
    static class Passengers extends Thread{
        // 机场安检类
        private final FlightSecurity fightSecurity;
        // 旅客的身份证
        private final String idCard;
        // 旅客登机牌
        private final String boardingPass;
        Passengers(FlightSecurity fightSecurity, String idCard, String boardingPass) {
            this.fightSecurity = fightSecurity;
            this.idCard = idCard;
            this.boardingPass = boardingPass;
        }
        @Override
        public void run() {
            while(true){
                // 旅客不断地过安检
                fightSecurity.pass(boardingPass,idCard);
            }
        }
    }
    public static void main(String[] args) {
        // 定义三个旅客,身份证和登机牌首字母相同
        final FlightSecurity flightSecurity= new FlightSecurity();
        new Passengers(flightSecurity,"A","A").start();
        new Passengers(flightSecurity,"B","B").start();
        new Passengers(flightSecurity,"C","C").start();
    }
}

三 测试

1 测试结果1

Exception in thread "Thread-1" Exception in thread "Thread-0" java.lang.RuntimeException: ======Excepton======The 356 paaaenges,boardingPass [B],idCard [A]
    at concurrent.FlightSecurity.FlightSecurity.check(FlightSecurity.java:20)
    at concurrent.FlightSecurity.FlightSecurity.pass(FlightSecurity.java:14)
    at concurrent.FlightSecurity.FightSecurityTest$Passengers.run(FightSecurityTest.java:24)
java.lang.RuntimeException: ======Excepton======The 356 paaaenges,boardingPass [B],idCard [A]
    at concurrent.FlightSecurity.FlightSecurity.check(FlightSecurity.java:20)
    at concurrent.FlightSecurity.FlightSecurity.pass(FlightSecurity.java:14)
    at concurrent.FlightSecurity.FightSecurityTest$Passengers.run(FightSecurityTest.java:24)

2 测试结果2

Exception in thread "Thread-0" Exception in thread "Thread-1" java.lang.RuntimeException: ======Excepton======The 953 paaaenges,boardingPass [C],idCard [C]
    at concurrent.FlightSecurity.FlightSecurity.check(FlightSecurity.java:20)
    at concurrent.FlightSecurity.FlightSecurity.pass(FlightSecurity.java:14)
    at concurrent.FlightSecurity.FightSecurityTest$Passengers.run(FightSecurityTest.java:24)
java.lang.RuntimeException: ======Excepton======The 1039 paaaenges,boardingPass [C],idCard [C]
    at concurrent.FlightSecurity.FlightSecurity.check(FlightSecurity.java:20)
    at concurrent.FlightSecurity.FlightSecurity.pass(FlightSecurity.java:14)
    at concurrent.FlightSecurity.FightSecurityTest$Passengers.run(FightSecurityTest.java:24)

四 问题分析

在多线程情况下调用 pass 方法,虽然参数的传递百分百保证就是这两个值,但是在 pass 方法中对这两个值的赋值很有可能交叉,不能保证原子性操作。

解决的方法是给 pass 方法加上 synchronized 关键字。

public synchronized void pass(String boardingPass,String idCard)

五 说明

在 Java 中经常会听到线程安全的类和线程非安全的类,所谓线程安全的类是指多个线程同时进行操作时,不会引起数据不一致问题,反之则是线程非安全的类,在线程安全的类中经常会看到 synchronized 关键字的身影。

到此这篇关于Java模拟实现机场过安检处理流程的文章就介绍到这了,更多相关Java 机场安检内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java实战之多线程模拟站点售票

    一.实验题目 二.分析 哦吼,这次的实验题目是一道非常经典的多线程买票问题.题目要求我们创建5个线程来模拟卖票,当然这其中就包含多线程存在也就是我们要解决的问题,重复卖票和超额卖票.即多个窗口卖出同一张票以及窗口卖出非正数编号的票. 不过这个问题可以先放一下,我们先来创建基础的线程模型,并在主方法中创建五个线程让他们跑起来: 话不多说,上代码. public class Ticket { public static void main(String[] args) { for(int i = 1

  • Java模拟实现机场过安检处理流程

    目录 一 场景描述 二 实战 三 测试 四 问题分析 五 说明 一 场景描述 乘飞机时,在进入登机口之前必须经过安全检查,安检口类似于独木桥,每次只能通过一个人,工作人员除了检查你的登机牌外,还有一些其它检查.在此模拟一个非线程安全的安检口类,旅客(线程)分别手持登机牌和身份证接受工作人员的检查. 二 实战 1 FlightSecurity package concurrent.FlightSecurity; public class FlightSecurity { private int c

  • Java 文创商城系统的实现流程

    一.项目简述 功能:本系统分用户前台和管理员后台. 前台展示+后台管理,前台界面可实现用户登录,用户注 册,商品展示,商品明细展示,用户信息修改,密码修 改,购物车添加,商品购买,商品结算,订单查询,购物 车查询,后台管理可实现商品管理,订单管理,用户管理 二.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持) 项目技术: JSP +Spring + SpringMVC

  • Java模拟实现HTTP服务器项目实战

    目录 一,HTTP协议的工作过程 二.HTTP协议格式 1,抓包分析搜狗主页 2,协议格式总结 三.版本V1 四.版本V2 1,创建HttpRequest类 2,创建HttpResponse类 3,创建HttpServer类 五.版本V3 1.创建HttpRequest类 2,创建HttpResponse类 3,创建HttpServer类 4,insex.html 一,HTTP 协议的工作过程 二.HTTP协议格式 1,抓包分析搜狗主页 HTTP请求 首行: [方法] + [url] + [版本

  • Java模拟微信来电提醒示例

    目录 引言 效果图如下 代码思路 总结 引言 前几天在抖音刷到一个老哥做的章鱼哥来电提醒,感觉挺好玩的,于是就用Java搞了一个. 大致流程如下 章鱼哥来电提醒 文本一朗读 点击鼠标特效,紧接着摄像机移动到电脑右下角 中间穿插这章鱼哥朗诵视频(无声,声源是文本内容) 右下角弹出章鱼哥来电提醒 右下角来电倒计时+文本二+文本三 播放章鱼哥朗诵 章鱼哥朗诵视频+zhyg.wav声音 开搞 !! 效果图如下 代码思路 是用java.swing 的 JFrame做的,它原生的按钮太难看,于是想着用Jla

  • Java模拟QQ桌面截图功能实现方法

    本文实例讲述了Java模拟QQ桌面截图功能实现方法.分享给大家供大家参考.具体如下: QQ的桌面截图功能非常方便,去年曾用Java模拟过一个,现整理出来. 本方法首先需要抓到屏幕的整个图象,将图象显示在一个JFrame中,再将JFrame全屏显示,这样就模拟出了一个桌面,Java也就可以获得鼠标的作用区域从而实现桌面中的小范围截屏. import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import

  • java模拟post请求发送json的例子

    java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main.utils; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; public class HttpUtilTest { Log log = new Log(this.getClass());//初始化

  • Java 模拟银行自助终端系统

    一. 本系统模拟银行用户使用ATM机开户.查询.存款.取款功能,要求使用java语言编程实现. 说明: 1. 对于数据输入异常,可使用java异常处理机制进行处理. 2. 评分将以功能实现与代码规范性相结合的方式进行考核. 3. 如果对项目需求有疑问,可以随时以QQ留言方式联系我进行咨询. 4. 国庆放假期间,每天都有老师在公司值班,10月4日是我在公司值班,10月7日正常上班,欢迎大家到公司来做项目. 二. 项目功能要求: 项目开始运行显示主菜单为: 银行自助终端系统 ************

  • java模拟http的Get/Post请求,并设置ip与port代理的方法

    本文涉及3个基本点: 1.因为很多公司的内网都设有代理,浏览器通过ip与port上网,而java代码模拟http get方式同样需要外网代理: 2.Java实现http的Get/Post请求代码: 3.主要是设置HttpURLConnection请求头里面的属性 比如Cookie.User-Agent(浏览器类型)等等. 比如:http请求中添加Header conn.setRequestProperty("Authorization", authorization); 注:我就在网上

  • Java模拟HTTP Get Post请求 轻松实现校园BBS自动回帖

    本文实例为大家分享了Java模拟HTTP Get Post请求,校园BBS自动回帖功能,供大家参考,具体内容如下 设计思路 找到帖子链接的集合,最后面数字变化, 就可以得到不同的帖子 防止帖子发表会又被删了的情况, 进行判断帖子是否存在 遍历这个集合, 对每个链接做回帖的POST请求 重难点 Note: 回帖需要用户登录信息 一种是利用Cookie 另一种是进行模拟登录 本文采用前者 代码 代码比较简单,注意事项是找到自己的Cookie,赋给String yourCookeie就可以直接运行 主

  • java模拟cookie登陆操作

    在使用java访问URL时,如果该URL需要身份验证,那么就不能够直接访问,因为没有登陆.那么,如何解决这个问题呢? 方法是使用java模拟登陆,登陆后记录下cookie信息,在下次发起请求时时将cookie发送过去用以表明身份,这样就能够访问带有权限的URL了. 下面首先介绍使用java模拟登陆. // 连接地址(通过阅读html源代码获得,即为登陆表单提交的URL) String surl = "http://login.goodjobs.cn/index.php/action/UserLo

随机推荐