模拟售票系统java编程
- 格式:doc
- 大小:80.00 KB
- 文档页数:14
网上订票系统摘要随着我国铁路交通的不断发展,简单的窗口售票模式已经不能满足方便人们出行的目的。
采用先进的网络技术开发出方便快捷的网上订票系统是现代客运业务发展的必然需求。
本次设计的火车票网上订票系统通过访问主页,可以实现个人信息注册、车次车票价格查询、在线订票退票等基本功能,为用户提供方便快捷的订票服务。
本毕业设计的内容是设计并且实现一个基于web技术的网上订票网站,故而系统主要以j2EE作为开发基础,主要使用了struts2+spring+hibernate等多种框架的结合使用,用myeclipse作为开发工具,以SQL作为数据库,使用JAVA语言开发,页面采取JSP动态页面开发技术。
该系统界面简单、操作方便,容易维护。
关键词:网上订票网站 ,S.S.H(Struts ,Hibernate ,Spring),JAVA , JSPOnline booking systemAbstractWith the continuous development of China's railway transportation, simple window ticketing mode cannot satisfy the convenient for people to travel to. The use of advanced network technology to develop the online booking system convenient is the inevitable requirement of modern passenger business development. The online train tickets booking system design through the home page, you can realize the basic functions of the personal information registration, the train ticket price query, online booking, refund, provide convenient booking service for users.The contents of this graduation project is to design and implement an online booking website based on Web technology, this system mainly uses j2EE as the basis of development, the main use of the combined use of struts2+spring+hibernate and other frameworks, MyEclipse as a development tool, SQL as the database, using Macromedia's Dreamweaver as the interface landscaping tools, the use of JAVA language development take, page development technology of JSP dynamic pages. The system has a simple interface, easy operation, easy maintenance.Keywords:Online booking site ,Struts2 ,Hibernate ,Spring ,JAVA ,JSP目录摘要 (I)ABSTRACT ........................................................................................................................................ I I 1 绪论. (1)1 绪论 (1)2 系统的开发环境及技术简介 (1)2.1 系统开发环境 (1)2.1.1 MyEclipse (1)2.1.2 数据库简介 (2)2.1.3 Tomcat (2)2.2系统开发的思想与技术 (3)2.2.1JSP技术与MVC模式以及系统的基本框架 (3)2.2.2 S.S.H框架的优点 (3)3 系统总体设计 (6)3.1 总体功能模块 (6)3.2用户的功能模块 (6)3.3 系统业务描述 (7)3.4 程序流程图 (7)4系统详细设计与实现 (9)4.1系统和数据库的配置 (9)4.2概念模型设计 (10)4.3数据库逻辑模型 (10)4.4数据库表结构 (10)4.5平台数据表的设计 (12)5系统功能实现 (18)5.1程序的类图 (18)5.1.1订单Order类图 (18)5.1.2公告Gonggao类图 (19)5.1.3类型Leixing类图 (20)5.1.4票价Piaojia类图 (21)5.1.5时间Shijian类图 (22)5.1.6线路Xianlu类图 (23)5.1.7用户User类图 (24)5.2程序的时序图 (26)5.2.1 公告模块时序图 (26)5.2.2 类型模块时序图 (27)5.2.3 票价模块时序图 (28)5.2.4 线路模块时序图 (29)5.2.5 用户模块时序图 (30)5.3系统功能实现的主要框架 (30)5.3.1 SSH框架 (30)5.3.2 hibernate配置文件 (30)5.3.3 struts配置文件 (32)5.3.4 spring配置文件 (33)5.4系统功能实现的主要模块 (34)5.4.1 登陆页面 (34)5.4.2 用户注册页面 (36)5.4.3 网站主页面 (37)6系统的调试与测试 (39)6.1软件测试的目的 (39)6.2软件测试的任务 (39)6.3测试环境 (39)6.4测试环境的配置 (40)6.4.1 创建安装项目 (40)6.4.2 添加项目输出 (41)6.4.3 运行项目 (43)参考文献 (45)致谢 (46)1 绪论1 绪论火车站市场的管理和规范问题,是困扰我们多年的一个老问题,订票是客运业务中的一个最基本的业务,表面上看,它只是火车站业务的一个简单的部分,但是它涉及到管理与客户服务等多方面,因此,过去传统的售票方式已经不能满足现代客运业务流量剧增的客观要求,这就要求一种全新的订票方式——网上订票,来缓解订票高峰时期的客运压力,并为用户提供方便快捷的订票服务。
火车票售票管理系统介绍火车票售票管理系统是一个用于管理火车票售票、订单管理和客户信息的软件系统。
该系统提供了一个方便快捷的平台,使用户能够在线浏览、预订和购买火车票,并对订单进行管理和查询。
功能1. 火车票查询用户可以通过系统提供的火车票查询功能查找目标日期和路线的火车票。
用户可以输入出发地、目的地和日期等信息来查找合适的火车票。
查询结果包括列车的发车时间、到达时间、车次、票价和余票数量等。
2. 火车票预订用户可以查看到的火车票信息后进行预订。
用户需要输入乘车人的信息,并选择座位类型和票数进行预订。
系统会根据用户的选择自动生成订单号,并提供支付链接进行付款。
3. 订单管理用户可以在系统中管理自己的订单。
用户可以查看订单详情,包括订单号、乘车人信息、座位类型、票价和支付状态等。
用户还可以取消未支付的订单,并根据需要重新预订。
4. 客户信息管理系统提供了客户信息管理功能,用户可以在系统中维护个人信息。
用户可以修改个人信息,包括姓名、性别、手机号码和电子邮箱等。
用户也可以查看自己的历史订单和购票记录。
5. 系统管理系统管理员可以对火车票售票管理系统进行管理。
管理员可以管理火车票信息,包括添加新的火车车次、修改票价和调整余票数量等。
管理员还可以管理用户信息,包括添加新用户、修改用户信息和删除用户等。
架构火车票售票管理系统的架构包括前端和后端两部分。
前端前端使用HTML、CSS和JavaScript编写,采用响应式设计,能够在不同终端设备上良好地展示。
前端实现了用户界面和交互逻辑,包括火车票查询、预订、订单管理和客户信息管理等功能。
后端后端使用Java编程语言开发,采用Spring框架和Spring Boot技术,实现了业务逻辑和数据交互。
后端处理用户请求,调用相应的服务进行数据处理和查询,并将结果返回给前端。
数据库设计火车票售票管理系统使用关系型数据库存储数据。
数据库中包括以下主要表:用户表存储用户的个人信息,包括用户ID、姓名、性别、手机号码和电子邮箱等。
售票系统方案第1篇售票系统方案一、项目背景随着社会经济的发展和人们生活水平的提高,文化娱乐活动日益丰富,各类演出、体育赛事等活动的门票销售业务量不断攀升。
为满足市场需求,提高票务销售效率,降低排队等候时间,实现公平、公正、透明的售票流程,本项目旨在构建一套合法合规的售票系统。
二、系统目标1. 提高票务销售效率,缩短购票时间。
2. 确保售票过程的公平、公正、透明。
3. 方便用户购票,提高用户体验。
4. 降低人力成本,提高管理水平。
5. 预防和打击黄牛倒卖门票行为。
三、系统设计1. 用户端用户可通过PC端、移动端等渠道访问售票系统,实现以下功能:- 用户注册与登录;- 活动查询、票务信息查询;- 在线选座、购票、支付;- 订单查询、修改与取消;- 电子票获取、验票;- 客户服务与投诉建议。
为保障用户隐私,用户需同意并遵守相关法律法规,不得泄露他人信息。
2. 管理端管理人员可通过后台管理系统进行以下操作:- 活动发布与管理;- 票务管理;- 用户管理;- 订单管理;- 数据分析与报表;- 系统设置与权限分配。
管理人员需严格遵守相关法律法规,确保售票过程合法合规。
3. 技术架构售票系统采用前后端分离的技术架构,前端负责展示与交互,后端负责数据处理与存储。
具体如下:- 前端:使用HTML、CSS、JavaScript等技术实现用户界面,采用响应式设计,兼容不同设备;- 后端:采用Java、Python等编程语言,使用Spring Boot、Django等框架,实现业务逻辑处理、数据存储与接口调用;- 数据库:采用MySQL、Oracle等关系型数据库,存储用户、活动、票务、订单等数据;- 服务器:使用Linux系统,部署在云平台上,确保系统稳定可靠。
4. 安全措施为确保系统安全,采取以下措施:- 数据加密:采用SSL/TLS等加密技术,保障数据传输安全;- 用户认证:采用用户名密码、短信验证码等方式进行用户身份认证;- 权限控制:实现不同角色之间的权限分离,防止越权操作;- 防火墙与安全审计:部署防火墙,防止恶意攻击,进行安全审计,及时发现并处理异常。
作者:dracula1213安装手册1.安装必要的程序1.1 安装sqlserver2005数据库运行售票系统需要安装sqlserver2005和jdk1.6。
首先说明:Sqlserver2005可以不安装在本机上,但如果安装在另外的机器上,运行售票程序连接Sqlserver2005时,需将装有Sqlserver2005计算机的windows防火墙关闭,否则会连接不上。
重要说明:无论数据库是否安装在本机上,本售票程序都不支持两台以上的计算机连接到同一个数据库上,本程序并做任何的并发处理,任何两台以上的计算机同时针对同一个数据库的操作,都可能引发数据库错误。
首先准备sqlserver2005的安装程序,运行,首先安装程序会进行一些检查,有一个IIS Admin Service要安装,大家可以通过“运行”-输入services.msc查看系统是否已安装此服务,并且是否运行,如果没有安装,Sqlserver2005的安装前检查会提示错误:。
如果没有安装此服务,大家可以通过控制面版中的“添加/删除程序”中的添加windows组件来安装此服务。
sqlserver2005的安装检查通过后,下一步,到如下的界面:此处要把第一项“SQL Server Database Services”和最后一项“工作站组件……”勾选上,然后点选“高级”,可修改安装路径,然后下一步,选择默认实例即可。
然后一直下一步即可,当系统出现要让你指定服务器身份验证模式的时候,要选择“SQL Server 和 Windows身份验证模式”,然后指定“sa”用户的密码,请记住此密码,以后数据库的用户便是“sa”,密码便是此密码,其它步骤系统默认即可。
安装完成后,查看服务项是否有此服务,并确定此服务处于启动状态;同时查看任务管理器是否有sqlserver.exe的进程:如果有此两项,说明sqlserver2005已安装成功。
1.2 导入数据库打开开始菜单-程序,找到Microsoft SQL Server 2005,运行该目录下的SQL Server Management Studio,运行界面如下:将“身份验证”选择“SQL Server身份验证”,登录名录入“sa”,密码录入先前安装Sqlserver2005时指定的密码,连接,连接成功后,界面如下:选中左边列表中的“数据库”单击右键,选择“还原数据库”:运行后界面如下:在“目标数据库”中输入数据库名称,此名称可随便起,但要记住此名称,接下来配置售票系统时要用到此名称。
java 多线程练习题Java多线程练习题在Java中,多线程是非常常见和重要的概念。
通过使用多线程,我们可以实现并发处理和同时执行多个任务。
为了熟悉和掌握多线程的用法,下面将给出一些Java多线程的练习题。
1. 编写一个Java程序,创建两个线程,分别输出从1到50和从51到100的数字。
确保两个线程交替输出数字,即输出的结果应为:1,51,2,52,3,53...,99,100。
2. 编写一个Java程序,创建三个线程,分别输出字符A、字符B和字符C。
确保三个线程按顺序交替输出字符,即输出的结果应为:ABCABCABC...3. 编写一个Java程序,模拟购票系统。
假设有100张票,多个窗口同时售票,要求保证售出的票没有重复,即每张票只能卖给一个人。
4. 编写一个Java程序,使用多线程实现生产者-消费者模型。
假设有一个信号灯,生产者线程可以向信号灯放置数据,消费者线程可以从信号灯中取走数据。
要求生产者线程和消费者线程交替执行,确保生产者放置数据后,消费者才能取走数据。
5. 编写一个Java程序,使用多线程计算1到100之间所有数字的和。
要求将任务分成10个子任务,由10个线程并行地执行,并最后将子任务的计算结果合并得到最终结果。
6. 编写一个Java程序,实现一个简单的线程池。
线程池中包含固定数量的线程,多余的任务将会排队等待执行。
当新的任务到达时,如果有空闲线程,则立即执行,否则任务将会进入等待队列。
以上是一些Java多线程的练习题,通过完成这些练习题,您将熟悉和掌握多线程的基本用法和常见应用场景。
希望这些练习题对您的学习和实践有所帮助!。
基于Java和数据库系统设计的航空售票系统航空售票系统是一个复杂的软件系统,涉及到用户预订机票、航班信息管理、座位管理、票务管理、支付系统等多个模块。
本文将着重介绍基于Java和数据库系统设计的航空售票系统的整体架构和关键功能模块。
一、系统架构1.1 系统整体架构航空售票系统的整体架构可以分为三层:表示层、业务逻辑层和数据访问层。
- 表示层:负责与用户交互,包括用户界面展示、用户输入接收和响应等。
通常采用Web或移动应用作为表示层。
- 业务逻辑层:处理用户的请求,进行业务逻辑的处理,包括航班查询、订票、支付等。
- 数据访问层:负责与数据库进行交互,包括数据的读取、更新和删除等操作。
1.2 技术选型基于Java的航空售票系统可以采用Spring框架作为整体框架,通过Spring MVC实现表示层的功能,Spring IOC实现业务逻辑层的功能,MyBatis或Hibernate实现数据访问层的功能。
Java语言本身具有平台无关性和较好的跨平台兼容性,能够满足航空售票系统在不同平台上的部署需求。
二、系统功能模块2.1 用户模块用户模块包括用户注册、登录、个人信息管理等功能。
注册时需要验证用户输入的信息,并将用户信息存储到数据库中;登录时需要验证用户的身份信息,确保用户登录后能够进行相关操作;个人信息管理包括用户的个人资料和订单信息的展示和管理等。
2.2 航班查询模块航班查询模块允许用户根据出发地、目的地、日期等条件查询符合条件的航班信息。
系统需要从数据库中读取航班信息,并将符合条件的航班信息展示给用户。
2.3 订票模块订票模块允许用户选择符合条件的航班进行订票操作。
用户需要输入乘客信息、选择座位以及支付方式等。
系统需要对用户输入的信息进行验证,确保订单的合法性;在用户订票成功后,需要更新数据库中的座位信息和订单信息。
2.4 支付模块支付模块是航空售票系统中非常重要的一个模块。
用户在订票成功后需要进行支付操作,系统需要与第三方支付平台进行交互,完成支付流程。
import java.awt.Dimension;import java.awt.GridLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JTextField;public class LogOn{public static void main(String[] args)throws SQLException{final JFrame jfrmlogin=new JFrame("系统登录");jfrmlogin.setSize(400,280);Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();jfrmlogin.setLocation((int) (screenSize.width-400)/2,(int)(screenSize.height-300)/2);//设置框出现的位置JPanel p1=new JPanel();p1.add(new JLabel("用户名:"));final JTextField jtxtuser=new JTextField(14);JPanel p2=new JPanel();p2.add(new JLabel("密码:"));final JPasswordField jspwd=new JPasswordField(14);JPanel p3=new JPanel();final JButton jbtUser=new JButton("登录");final JButton jbtreg=new JButton("注册");JButton jbtexit=new JButton("退出");p1.add(jtxtuser);p2.add(jspwd);p3.add(jbtUser);p3.add(jbtreg);p3.add(jbtexit);jbtUser.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){Connection conn=null;ResultSet rs=null;Statement stmt=null;if(e.getSource()==jbtUser){try {Class.forName("oracle.jdbc.driver.OracleDriver");conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "123");stmt=conn.createStatement();String USER_NAME=jtxtuser.getText();rs = stmt.executeQuery("select * from TICKET_USERS where USER_NAME='"+jtxtuser.getText()+"'and USER_PWD='"+jspwd.getText()+"'");if(rs.next()){if(USER_NAME.equals("admin")==false){MainUser mf=new MainUser();mf.setVisible(true);jfrmlogin.dispose();}else{MainFrame mf=new MainFrame();mf.setVisible(true);jfrmlogin.dispose();}}else{JOptionPane.showMessageDialog(null,"用户名或密码不一致,请重新输入!","系统提示",JOptionPane.ERROR_MESSAGE);jtxtuser.setText("");jspwd.setText("");}} catch (Exception ex) {JOptionPane.showMessageDialog(null,"用户名或密码不一致,请重新输入!","系统提示",JOptionPane.ERROR_MESSAGE);jtxtuser.setText("");jspwd.setText("");}}}});jbtreg.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){Connection conn=null;ResultSet rs=null;Statement stmt=null;if(e.getSource()==jbtreg){try {Class.forName("oracle.jdbc.driver.OracleDriver");conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "123");stmt=conn.createStatement();rs = stmt.executeQuery("insert into TICKET_USERS(USER_NAME,USER_PWD) values('"+jtxtuser.getText()+"','"+jspwd.getText()+"')");if(rs.next()){JOptionPane.showMessageDialog(null,"你已成功注册!可以登录了!","系统提示",RMATION_MESSAGE);jtxtuser.setText("");jspwd.setText("");}else{JOptionPane.showMessageDialog(null,"用户注册失败!","系统提示",JOptionPane.ERROR_MESSAGE);jtxtuser.setText("");jspwd.setText("");}} catch (Exception ex) {JOptionPane.showMessageDialog(null,"用户注册失败!","系统提示",JOptionPane.ERROR_MESSAGE);jtxtuser.setText("");jspwd.setText("");}}}});jbtexit.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){System.exit(0);}});jfrmlogin.getContentPane().setLayout(new GridLayout(3,1));jfrmlogin.getContentPane().add(p1);jfrmlogin.getContentPane().add(p2);jfrmlogin.getContentPane().add(p3);jfrmlogin.setVisible(true);}}import java.sql.*;public class ConnectOracle{public static void connection(String[] args) throws SQLException {//Connection conn=null;//Statement stmt=null;//ResultSet rs=null;//JDBC 直连Oracle数据库加载驱动try {System.out.println("正在连接数据库.......");Class.forName("oracle.jdbc.driver.OracleDriver");/*conn =*/DriverManager.getConnection("jdbc:oracle:thin:@localh ost:1521:orcl", "system", "123");System.out.println("已经连接到数据库.....");//stmt=conn.createStatement();//stmt.executeQuery("insert intostudent(STUID,STUNAME,SEX,AGE)values(0001,'李华','男',20)");//rs=stmt.executeQuery("select * from STUDENT");//System.out.println(" stuID "+" StuName " + " Sex " + " Age");//while(rs.next()){//int STUID=rs.getInt("STUID");//String STUNAME=rs.getString("STUNAME");//String SEX=rs.getString("SEX");//int AGE=rs.getInt("AGE");//System.out.println(" "+STUID+" "+STUNAME+" "+SEX+" "+AGE);//System.out.println(" STUID "+STUID+" STUNAME"+STUNAME+"SEX"+SEX+"AGE"+AGE);//}} catch (Exception ex) {//System.out.println("出现的异常为" + ex);;}}}import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;public class AddTicket extends JPanel implements ActionListener{Connection con;Statement st;JLabel jLabel1=new JLabel("票单价:");JLabel jLabel2=new JLabel("票日期:");JTextField jTextField1=new JTextField();JTextField jTextField2=new JTextField();JButton jButton1=new JButton("确定增加");public AddTicket(){try{jbInit();}catch(Exception exception){exception.printStackTrace();}}private void jbInit() throws Exception{Class.forName("oracle.jdbc.driver.OracleDriver");con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "123");this.setLayout(null);jLabel1.setBounds(new Rectangle(40,40,64,24));jLabel2.setBounds(new Rectangle(40,100,53,22));jTextField1.setBounds(new Rectangle(102,40,200,30));jTextField2.setBounds(new Rectangle(102,100,200,30));jButton1.setBounds(new Rectangle(120,220,150,32));jButton1.addActionListener(this);this.add(jLabel1);this.add(jTextField1);this.add(jLabel2);this.add(jTextField2);this.add(jButton1);ResultSet rs=null;st=con.createStatement();rs = st.executeQuery("select * from TICKET_TRANSCRIPT");if(rs.next()){jTextField1.setText(rs.getString("TICKET_PRICE"));}}public void actionPerformed(ActionEvent e){try{st=con.createStatement();st.executeUpdate("delete from TICKET");st.executeUpdate("delete from TICKET_ORDER_FORM");st.executeUpdate("insert into TICKET select * from TICKET_TRANSCRIPT");st.executeUpdate("update TICKET set TICKET_DATE='"+jTextField2.getText()+"'");st.executeUpdate("update TICKET set TICKET_PRICE='"+jTextField1.getText()+"'");JOptionPane.showMessageDialog(this,"票增加成功!");jTextField1.setText("");jTextField2.setText("");}catch(Exception ex){JOptionPane.showMessageDialog(this,"票增加失败!");ex.printStackTrace();}}}import javax.swing.*;import javax.swing.table.JTableHeader;import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.*;public class AdminInquireTicket extends JFrame{Connection con;Statement st;private JScrollPane scpDemo;private JTableHeader jth;private JTable tabDemo;private JButton btnShow;private JButton btnShow1;public AdminInquireTicket(){super("华清池售票系统");this.setSize(430,400);this.setLayout(null);this.setLocation(500,180);this.scpDemo = new JScrollPane();this.scpDemo.setBounds(10,50,390,270);this.btnShow = new JButton("显示票信息");this.btnShow.setBounds(10,10,390,30);this.btnShow1 = new JButton("返回");this.btnShow1.setBounds(260,330,120,30);JLabel jLabel1=new JLabel("余票总数:");JTextField jTextField1=new JTextField();jLabel1.setBounds(new Rectangle(20,330,100,30));jTextField1.setBounds(new Rectangle(90,330,70,30));add(this.scpDemo);add(this.btnShow);add(this.btnShow1);this.add(jLabel1);this.add(jTextField1);this.setVisible(true);try{Class.forName("oracle.jdbc.driver.OracleDriver");con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "123");ResultSet rs=null;int n = 0;st=con.createStatement();rs = st.executeQuery("select * from TICKET");while(rs.next()){n++;}jTextField1.setText(""+n+"");}catch(Exception exception){exception.printStackTrace();}this.btnShow1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){MainFrame mu=new MainFrame();mu.setVisible(true);dispose();}});this.btnShow.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent ae){btnShow_ActionPerformed(ae);}});}public void btnShow_ActionPerformed(ActionEvent ae){try{Class.forName("oracle.jdbc.driver.OracleDriver");Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "123");String sql = "select * from TICKET";PreparedStatement pstm = con.prepareStatement(sql);ResultSet rs = pstm.executeQuery();int count = 0;while(rs.next()){count++;}rs = pstm.executeQuery();Object[][] info = new Object[count][4];count = 0;while(rs.next()){info[count][0] = rs.getString("TICKET_NUM");info[count][1] = rs.getString("TICKET_DATE");info[count][2] = rs.getString("TICKET_PRICE");count++;}String[] title = {"票号","日期","票价"};this.tabDemo = new JTable(info,title);this.jth = this.tabDemo.getTableHeader();this.scpDemo.getViewport().add(tabDemo);}catch(ClassNotFoundException cnfe){JOptionPane.showMessageDialog(null,"查询失败!","错误",JOptionPane.ERROR_MESSAGE);}catch(SQLException sqle){JOptionPane.showMessageDialog(null,"查询失败!","错误",JOptionPane.ERROR_MESSAGE);}}}import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;public class BuyTicket extends JPanel implements ActionListener{Connection con;Statement st;JLabel jLabel1=new JLabel("用户名:");JLabel jLabel2=new JLabel("票编号:");JLabel jLabel3=new JLabel("票单价:");JLabel jLabel4=new JLabel("票日期:");JTextField jTextField1=new JTextField();JTextField jTextField2=new JTextField();JTextField jTextField3=new JTextField();JTextField jTextField4=new JTextField();JButton jButton1=new JButton("确定购买");public BuyTicket(){try{jbInit();}catch(Exception exception){exception.printStackTrace();}}private void jbInit() throws Exception{Class.forName("oracle.jdbc.driver.OracleDriver");con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "123");this.setLayout(null);jLabel1.setBounds(new Rectangle(40,40,64,24));jLabel2.setBounds(new Rectangle(40,100,53,22));jLabel3.setBounds(new Rectangle(40,160,61,27));jLabel4.setBounds(new Rectangle(40,220,61,27));jTextField1.setBounds(new Rectangle(102,40,200,30));jTextField2.setBounds(new Rectangle(102,100,200,30));jTextField3.setBounds(new Rectangle(102,160,200,33));jTextField4.setBounds(new Rectangle(102,220,200,33));jButton1.setBounds(new Rectangle(120,300,150,32));jButton1.addActionListener(this);this.add(jLabel1);this.add(jTextField1);this.add(jLabel2);this.add(jTextField2);this.add(jLabel3);this.add(jTextField3);this.add(jLabel4);this.add(jTextField4);this.add(jButton1);ResultSet rs=null;st=con.createStatement();rs = st.executeQuery("select * from (select rownum num, a.* from TICKET a)where num = (select count(1) from TICKET)");if(rs.next()){jTextField2.setText(rs.getString("TICKET_NUM"));jTextField3.setText(rs.getString("TICKET_PRICE"));jTextField4.setText(rs.getString("TICKET_DATE"));}}public void actionPerformed(ActionEvent e){if(e.getSource()==jButton1){try{st.executeUpdate("insert into TICKET_ORDER_FORM values('"+jTextField1.getText()+"','"+jTextField2.getText()+"','"+jTextField4.getText()+"','"+jTextFiel d3.getText()+"')");st.executeUpdate("delete from TICKET where TICKET_NUM='"+jTextField2.getText()+"'");JOptionPane.showMessageDialog(this,"购票成功!");jTextField1.setText("");jTextField2.setText("");jTextField3.setText("");jTextField4.setText("");}catch(Exception ex){JOptionPane.showMessageDialog(this,"购票失败!");ex.printStackTrace();}}}}import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextField;public class InquireTicket extends JPanel implements ActionListener{Connection con;Statement st;JLabel jLabel1=new JLabel("余票数:");JTextField jTextField1=new JTextField();JLabel jLabel2=new JLabel("票价:");JTextField jTextField2=new JTextField();JLabel jLabel3=new JLabel("日期:");JTextField jTextField3=new JTextField();public InquireTicket(){try{jbInit();}catch(Exception exception){exception.printStackTrace();}}private void jbInit() throws Exception{Class.forName("oracle.jdbc.driver.OracleDriver");con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "123");this.setLayout(null);jLabel1.setBounds(new Rectangle(40,50,64,24));jTextField1.setBounds(new Rectangle(102,50,200,30));jLabel2.setBounds(new Rectangle(40,100,64,24));jTextField2.setBounds(new Rectangle(102,100,200,30));jLabel3.setBounds(new Rectangle(40,150,64,24));jTextField3.setBounds(new Rectangle(102,150,200,30));this.add(jLabel1);this.add(jTextField1);this.add(jLabel2);this.add(jTextField2);this.add(jLabel3);this.add(jTextField3);ResultSet rs=null;int count = 0;st=con.createStatement();rs = st.executeQuery("select * from TICKET");while(rs.next()){jTextField2.setText(rs.getString("TICKET_PRICE"));jTextField3.setText(rs.getString("TICKET_DATE"));count++;}jTextField1.setText(""+count+"");}public void actionPerformed(ActionEvent e){}}import java.awt.Dimension;import java.awt.Font;import java.awt.Rectangle;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;public class MainFrame extends JFrame implements ActionListener{JPanel contentPane;JMenuBar jMenuBar1=new JMenuBar();JMenu jMenu0=new JMenu("系统");JMenuItem jMenuItem0=new JMenuItem("退出");JMenu jMenu1=new JMenu("增加票");JMenuItem jMenuItem1=new JMenuItem("增加票");JMenu jMenu2=new JMenu("修改票");JMenuItem jMenuItem2=new JMenuItem("修改票");JMenu jMenu3=new JMenu("查询票");JMenuItem jMenuItem3=new JMenuItem("查询票");JLabel jLabel1=new JLabel(" 华清池售票系统(管理员)");JLabel jLabel2=new JLabel(" 延安大学软件12课程设计");public MainFrame(){try{setDefaultCloseOperation(EXIT_ON_CLOSE);jbInit();}catch(Exception exception){exception.printStackTrace();}}private void jbInit() throws Exception{contentPane =(JPanel) getContentPane();contentPane.setLayout(null);Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();setLocation((int) (screenSize.width-400)/2,(int)(screenSize.height-360)/2);setSize(new Dimension(400,420));setTitle("华清池售票系统");jMenuItem0.addActionListener(this);jMenuItem1.addActionListener(this);jMenuItem2.addActionListener(this);jMenuItem3.addActionListener(this);setJMenuBar(jMenuBar1);jMenuBar1.add(jMenu0);jMenuBar1.add(jMenu1);jMenuBar1.add(jMenu2);jMenuBar1.add(jMenu3);jMenu0.add(jMenuItem0);jMenu1.add(jMenuItem1);jMenu2.add(jMenuItem2);jMenu3.add(jMenuItem3);contentPane.add(jLabel1);contentPane.add(jLabel2);jLabel1.setFont(new java.awt.Font("黑体",Font.BOLD,20));jLabel1.setBounds(new Rectangle(65,70,275,55));jLabel2.setFont(new java.awt.Font("黑体",Font.BOLD,16));jLabel2.setBounds(new Rectangle(90,150,200,35));}public void actionPerformed(ActionEvent actionEvent){if(actionEvent.getSource()==jMenuItem0){JOptionPane.showMessageDialog(null,"您已成功退出系统!","系统提示",JOptionPane.CANCEL_OPTION);System.exit(0);}if(actionEvent.getSource()==jMenuItem1){AddTicket AddT=new AddTicket();this.remove(this.getContentPane());this.setContentPane(AddT);this.setVisible(true);}if(actionEvent.getSource()==jMenuItem2){ModifyTicket AddT=new ModifyTicket();this.remove(this.getContentPane());this.setContentPane(AddT);this.setVisible(true);}if(actionEvent.getSource()==jMenuItem3){this.setVisible(false);AdminInquireTicket AddT=new AdminInquireTicket();this.remove(this.getContentPane());this.setContentPane(AddT);this.setVisible(true);}}}import java.awt.Dimension;import java.awt.Font;import java.awt.Rectangle;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;public class MainUser extends JFrame implements ActionListener {JPanel contentPane;JMenuBar jMenuBar1=new JMenuBar();JMenu jMenu0=new JMenu("系统");JMenuItem jMenuItem0=new JMenuItem("退出");JMenu jMenu1=new JMenu("购票");JMenuItem jMenuItem1=new JMenuItem("购票");JMenu jMenu2=new JMenu("查询余票");JMenuItem jMenuItem2=new JMenuItem("查询余票");JMenu jMenu3=new JMenu("我的订票");JMenuItem jMenuItem3=new JMenuItem("我的订票");JLabel jLabel1=new JLabel(" 华清池售票系统(游客)");JLabel jLabel2=new JLabel(" 延安大学软件12课程设计");public MainUser(){try{setDefaultCloseOperation(EXIT_ON_CLOSE);jbInit();}catch(Exception exception){exception.printStackTrace();}}private void jbInit() throws Exception{contentPane =(JPanel) getContentPane();contentPane.setLayout(null);Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();setLocation((int) (screenSize.width-400)/2,(int)(screenSize.height-340)/2);setSize(new Dimension(400,420));setTitle("华清池售票系统");jMenuItem0.addActionListener(this);jMenuItem1.addActionListener(this);jMenuItem2.addActionListener(this);jMenuItem3.addActionListener(this);setJMenuBar(jMenuBar1);jMenuBar1.add(jMenu0);jMenuBar1.add(jMenu1);jMenuBar1.add(jMenu2);jMenuBar1.add(jMenu3);jMenu0.add(jMenuItem0);jMenu1.add(jMenuItem1);jMenu2.add(jMenuItem2);jMenu3.add(jMenuItem3);contentPane.add(jLabel1);contentPane.add(jLabel2);jLabel1.setFont(new java.awt.Font("黑体",Font.BOLD,20));jLabel1.setBounds(new Rectangle(65,70,275,55));jLabel2.setFont(new java.awt.Font("黑体",Font.BOLD,16));jLabel2.setBounds(new Rectangle(90,150,200,35));}public void actionPerformed(ActionEvent actionEvent){if(actionEvent.getSource()==jMenuItem0){JOptionPane.showMessageDialog(null,"您已成功退出系统!","系统提示",JOptionPane.CANCEL_OPTION);System.exit(0);}if(actionEvent.getSource()==jMenuItem1){BuyTicket AddT=new BuyTicket();this.remove(this.getContentPane());this.setContentPane(AddT);this.setVisible(true);}if(actionEvent.getSource()==jMenuItem2){InquireTicket AddT=new InquireTicket();this.remove(this.getContentPane());this.setContentPane(AddT);this.setVisible(true);}if(actionEvent.getSource()==jMenuItem3){this.setVisible(false);MyTicket AddT=new MyTicket();this.remove(this.getContentPane());this.setContentPane(AddT);this.setVisible(true);}}}import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;public class ModifyTicket extends JPanel implements ActionListener{Connection con;Statement st;JLabel jLabel1=new JLabel("票单价:");JLabel jLabel2=new JLabel("票日期:");JTextField jTextField1=new JTextField();JTextField jTextField2=new JTextField();JButton jButton1=new JButton("确定修改");public ModifyTicket(){try{jbInit();}catch(Exception exception){exception.printStackTrace();}}private void jbInit() throws Exception{Class.forName("oracle.jdbc.driver.OracleDriver");con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "123");this.setLayout(null);jLabel1.setBounds(new Rectangle(40,40,64,24));jLabel2.setBounds(new Rectangle(40,100,53,22));jTextField1.setBounds(new Rectangle(102,40,200,30));jTextField2.setBounds(new Rectangle(102,100,200,30));jButton1.setBounds(new Rectangle(120,200,150,32));jButton1.addActionListener(this);this.add(jLabel1);this.add(jTextField1);this.add(jLabel2);this.add(jTextField2);this.add(jButton1);ResultSet rs=null;st=con.createStatement();rs = st.executeQuery("select * from (select rownum num, a.* from TICKET a)where num = (select count(1) from TICKET)");if(rs.next()){jTextField1.setText(rs.getString("TICKET_PRICE"));jTextField2.setText(rs.getString("TICKET_DATE"));}}public void actionPerformed(ActionEvent e){if(e.getSource()==jButton1){try{Class.forName("oracle.jdbc.driver.OracleDriver");Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "123");ResultSet rs=null;st=con.createStatement();rs = st.executeQuery("select * from TICKET");if(rs.next()){st.executeUpdate("update TICKET set TICKET_DATE='"+jTextField2.getText()+"'");st.executeUpdate("update TICKET set TICKET_PRICE='"+jTextField1.getText()+"'");}JOptionPane.showMessageDialog(this,"修改成功!");jTextField1.setText("");jTextField2.setText("");}catch(Exception ex){JOptionPane.showMessageDialog(this,"修改失败!");ex.printStackTrace();}}}}import javax.swing.*;import javax.swing.table.JTableHeader;import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.*;public class MyTicket extends JFrame{private JScrollPane scpDemo;private JTableHeader jth;private JTable tabDemo;private JButton btnShow;private JButton btnShow1;private JButton btnShow2;public MyTicket(){super("华清池售票系统");this.setSize(430,400);this.setLayout(null);this.setLocation(500,180);this.scpDemo = new JScrollPane();this.scpDemo.setBounds(10,45,390,270);this.btnShow = new JButton("我的订单");this.btnShow.setBounds(10,10,390,30);this.btnShow1 = new JButton("返回");this.btnShow1.setBounds(290,320,90,30);JLabel jLabel1=new JLabel("输入票号:");final JTextField jTextField1=new JTextField();jLabel1.setBounds(new Rectangle(20,320,100,30));jTextField1.setBounds(new Rectangle(90,320,70,30));this.btnShow2 = new JButton("退票");this.btnShow2.setBounds(170,320,90,30);add(this.btnShow1);add(this.btnShow2);this.add(jLabel1);this.add(jTextField1);this.setVisible(true);this.btnShow1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){MainUser mu=new MainUser();mu.setVisible(true);dispose();}});this.btnShow2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){try{Statement st;Class.forName("oracle.jdbc.driver.OracleDriver");Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "123");st=con.createStatement();ResultSet rs=st.executeQuery("select * from TICKET_ORDER_FORM where TICKET_NUM ='"+jTextField1.getText()+"'");if(rs.next()){String TICKET_NUM=rs.getString("TICKET_NUM");String TICKET_PRICE=rs.getString("TICKET_PRICE");String TICKET_DATE=rs.getString("TICKET_DATE");st.executeUpdate("insert into TICKET values('"+TICKET_NUM+"','"+TICKET_DATE+"','"+TICKET_PRICE+"')");st.executeUpdate("delete from TICKET_ORDER_FORM where TICKET_NUM='"+TICKET_NUM+"'");JOptionPane.showInputDialog(this,"退票成功!");jTextField1.setText("");}else{JOptionPane.showInputDialog(this,"退票失败!");}}catch(ClassNotFoundException cnfe){JOptionPane.showMessageDialog(null,"退票失败!","错误",JOptionPane.ERROR_MESSAGE);}catch(SQLException sqle){JOptionPane.showMessageDialog(null,"退票失败!","错误",JOptionPane.ERROR_MESSAGE);}}});this.btnShow.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent ae){btnShow_ActionPerformed(ae);}});add(this.scpDemo);add(this.btnShow);this.setVisible(true);}public void btnShow_ActionPerformed(ActionEvent ae){try{Class.forName("oracle.jdbc.driver.OracleDriver");Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "123");String sql = "select * from TICKET_ORDER_FORM";PreparedStatement pstm = con.prepareStatement(sql);ResultSet rs = pstm.executeQuery();int count = 0;。
/*项目:用多线程设计一个模拟火车站售票大厅的工作情形。
问题描述:火车站有许多售票窗口,有些开放,有些不开放。
顾客进入火车站售票厅后,到某个售票窗口排队等候,排到了就办理业务,然后离去。
如图2.1所示。
*//**共有五个类:*SimulateRailwayStation:具体运行主类;*RailwayStation:火车站售票大厅类*Agent类:代表火车站售票窗口类;*Customer类:顾客类;*List类:存储类*/import java.util.Date;import java.awt.*;import java.awt.event.*;public class SimulateRailwayStation extends Frame implements ActionListener{//预设火车站售票大厅有10个售票窗口protected static final int NUM_AGANTS=10;//预设目前正在售票的窗口为6个protected static final int NUM_INITIAL_AGANTS=6;//设置每个窗口办理售票业务的时间protected static final int BUSINESS_DELAY=6000;//设置有10辆火车的座位可以出售protected static final int MAX_TRAIN_NUM=10;//设置每个窗口从一个顾客完成到下一个顾客开始的时间间隔protected static final int MAX_NO_CUSTOMERS=200;//定义按钮,手动添加顾客。
private Button addcus=new Button("添加顾客");//定义按钮,模拟顾客自己离开private Button delcus=new Button("顾客离去");//定义按钮,增加售票窗口private Button addagent=new Button("增加售票窗口");//定义按钮,关闭售票窗口private Button delagent=new Button("关闭售票窗口");//10辆火车班次的信息protected static String[] train_num={"南京->北京,46次","南京->上海,34次","南京->福州,231次","南京->杭州,65次","南京->武汉,112次","南京->成都,77次","南京->天津,21次","南京->徐州,134次","南京->乌鲁目齐,335次","南京->合肥,456次"}; //与上面的信息对应的每辆火车的票务信息protected static int[] tickets={50,70,50,50,50,120,60,100,50,50};//实例化火车站售票大厅类private RailwayStation railwaystation=new RailwayStation();//建立窗体适配器,能关闭窗口private class WindowCloser extends WindowAdapter{public void windowClosing(WindowEvent we){railwaystation.stop();System.exit(0);}}//构造方法,完成界面初始化public SimulateRailwayStation(){super("Simulation RailwayStation");//设置面板Panel buttons=new Panel();buttons.setLayout(new FlowLayout());//在面板中添加按钮buttons.add(addcus);buttons.add(delcus);buttons.add(addagent);buttons.add(delagent);//对按钮设置监听addcus.addActionListener(this);delcus.addActionListener(this);addagent.addActionListener(this);delagent.addActionListener(this);//对窗体适配器设置监听addWindowListener(new WindowCloser());setLayout(new BorderLayout());add("North",railwaystation);add("South",buttons);setSize(500,200);validate();pack();show();//调用火车站售票大厅类的start()方法,开始售票工作railwaystation.start();}public void actionPerformed(ActionEvent ae){if(ae.getSource()==addcus){//新增顾客railwaystation.generateCustomer();}else if(ae.getSource()==delcus){}else if(ae.getSource()==addagent){//增加售票窗口railwaystation.addAgent();}else if(ae.getSource()==delagent){//关闭服务窗口railwaystation.retireAgent();}}public static void main(String[] args){SimulateRailwayStation smlt=new SimulateRailwayStation();}}/* 火车站售票大厅类 */class RailwayStation extends Panel implements Runnable{//定义售票窗口数组Agent[]protected Agent[] agent=new Agent[SimulateRailwayStation.NUM_AGANTS];protected Label[] labelAgent=new Label[SimulateRailwayStation.NUM_AGANTS]; protected Label labelQueue=new Label("正在等待的顾客数:0");protected Label labelServed=new Label("已经服务的顾客数:0");//定义可以进行售票服务的窗口protected int numAgents=SimulateRailwayStation.NUM_INITIAL_AGANTS;//定义存放已服务过的顾客数public static int numCustomerServered=0;private Thread thread=null;public RailwayStation(){setup("各窗口实时状态显示:");}//显示各售票窗口的实时工作状态private void setup(String title){//定义售票窗口的工作状态面板Panel agentPanel=new Panel();agentPanel.setLayout(new GridLayout(SimulateRailwayStation.NUM_AGANTS,1)); //各售票窗口的工作状态for(int i=0;i<SimulateRailwayStation.NUM_AGANTS;i++){if(i<numAgents){labelAgent[i]=new Label("窗口"+(i+1)+":空闲中...");agentPanel.add(labelAgent[i]);//实例化售票窗口agent[i]=new Agent(i);//售票窗口开始售票服务agent[i].start();}else{labelAgent[i]=new Label("窗口"+(i+1)+":暂停服务!");agentPanel.add(labelAgent[i]);}}//定义顾客候票情况面板Panel otherPanel=new Panel();otherPanel.setLayout(new GridLayout(2,1));otherPanel.add(labelQueue);otherPanel.add(labelServed);setLayout(new BorderLayout());//显示各售票窗口的工作状态安排在下部add("South",agentPanel);//显示顾客候票状况安排在中部add("Center",otherPanel);//显示调用本方法 setup()的参数安排在上部add("North",new Label(title));}//开始工作public void start(){if(thread==null){thread =new Thread(this);//启动线程thread.start();}}//线程,调用显示实时售票状况的updateDisplay()方法public void run(){while (true){this.updateDisplay();}}//实时处理售票的状况public void updateDisplay(){//定义在本窗口等候的顾客数int totalSize=0;//对可以服务的窗口进行循环for(int i=0;i<numAgents;i++){//getCIdOfHandling()方法为正在办理业务的顾客编号if(agent[i].getCIdOfHandling()!=0){//统计在本窗口等候的顾客数totalSize+=agent[i].getCusCountOfQueue();String s="窗口"+(i+1)+":正在办理顾客"+agent[i].getCIdOfHandling()+"业务"; //显示在本窗口等候的顾客数if(agent[i].getCusCountOfQueue()>0)labelAgent[i].setText(s+"["+agent[i].getCusOfQueue()+"正在等待]");elselabelAgent[i].setText(s);}else{labelAgent[i].setText("窗口"+(i+1)+":空闲中...");}}for(int i=numAgents;i<SimulateRailwayStation.NUM_AGANTS;i++) labelAgent[i].setText("窗口"+(i+1)+":暂停服务!");labelQueue.setText("正在等待的顾客数:"+totalSize);labelServed.setText("已经服务的顾客数:"+numCustomerServered); }//火车站售票窗口关闭public void stop(){thread=null;for(int i=0;i<numAgents;i++){//停止售票服务agent[i].halt();}}//添加窗口public void addAgent(){if(numAgents<SimulateRailwayStation.NUM_AGANTS){agent[numAgents]=new Agent(numAgents);agent[numAgents].start();numAgents++;}}//关闭窗口,该方法暂时没有使用public void retireAgent(){if(numAgents>1){agent[numAgents-1].halt();numAgents--;}}//接待顾客的方法public void generateCustomer(){//所有工作窗口的队列中,至少有一个顾客在排队时为真.boolean allAgentQueueHasOne=true;/* 如果所有正在工作窗口的队列中至少有一个顾客在排队,就把新顾客添加到队列最少的那个队.否则,就把顾客添加到没有业务处理的窗口中.*///对可以服务的窗口进行循环for(int i=0;i<numAgents;i++){//如果本窗口队列中没有顾客if(agent[i].getCusCountOfQueue()==0 && agent[i].getCIdOfHandling()==0) {//添加新顾客agent[i].joinNewCustomer(new Customer());allAgentQueueHasOne=false;break;}}//如果所有工作窗口都有顾客在等候if(allAgentQueueHasOne){//定义变量index存放最少等候顾客数的窗口编号int index=0;//对可以服务的窗口进行循环for(int i=0;i<numAgents;i++){if(agent[i].getCusCountOfQueue()<agent[index].getCusCountOfQueue()) {(见教材)}}//往最少顾客的窗口加新顾客agent[index].joinNewCustomer(new Customer());}}}/*火车站售票窗口类 */class Agent extends Panel implements Runnable{//窗口开放标志private boolean running =false;private int ID=-1;private int numCustomers=0;private int handlingCId=0;//该窗口中排队的顾客private List customersofqueue=new List(); //该窗口中已办理的顾客private List customersofhandled=new List(); private Label labelHandling=new Label();private Label labelThisQueue=new Label();private Thread thread=null;//构造方法,定义售票窗口编号public Agent(int ID){(见教材)}// 售票窗口开始售票服务public void start(){if(thread==null){running=true;thread =new Thread(this);//启动线程thread.start();}}//停止售票服务public void halt(){running=false;}//获得正在办理业务的顾客IDpublic int getCIdOfHandling(){return handlingCId;}//从本窗口的队列中获得将要服务的顾客public Customer requestCustomerFor(){if(customersofqueue.getSize()>0){Customer c=(Customer)customersofqueue.get(0);customersofqueue.delete(0);return c;}else{return null;}}//本窗口已办理业务的顾客数public int getCusCountOfHandled(){return numCustomers;}//本窗口已办理业务的顾客列表public String getCusOfHandled(){if(customersofhandled.getSize()>0){StringBuffer sbuf=new StringBuffer();sbuf.append("顾客");for(int i=0;i<customersofhandled.getSize();i++){sbuf.append(((Customer)customersofhandled.get(i)).getCustomerId()); if(i!=customersofhandled.getSize()-1)sbuf.append(",");}return sbuf.toString();}else{return new String("");}}//在窗口的队列中添加新顾客public synchronized void joinNewCustomer(Customer c){if(!customersofqueue.isFull()){customersofqueue.add(c);System.out.println("join to agent"+(this.ID+1));}}//获得本窗口的队列中的顾客列表public synchronized String getCusOfQueue(){if(customersofqueue.getSize()>0){StringBuffer sbuf=new StringBuffer();sbuf.append("Customer");for(int i=0;i<customersofqueue.getSize();i++){sbuf.append(((Customer)customersofqueue.get(i)).getCustomerId()); if(i!=customersofqueue.getSize()-1)sbuf.append(",");}return sbuf.toString();}else{return new String("");}}//获得本窗口的队列中的顾客数public int getCusCountOfQueue(){return customersofqueue.getSize();}//本窗口队列中的顾客未办理业务离去public void CustomerLeft(){if(customersofqueue.getSize()>0)customersofqueue.delete(customersofqueue.getSize()-1);}//顾客办理完业务离去public void releaseCustomer(Customer c){numCustomers++;customersofhandled.add(c);}//本窗口在不断的处理业务public void run(){while (running){try{thread.sleep((int)(Math.random()*SimulateRailwayStation.MAX_NO_CUSTOMERS)+1000); Customer customer=requestCustomerFor();//获得服务的顾客if(customer!=null){handlingCId=customer.getCustomerId();//获得顾客ID//办理业务时间:主要是询问等thread.sleep((int)(Math.random()*SimulateRailwayStation.BUSINESS_DELAY)/2); synchronized(this){//检索对应的票务信息for(int i=0;i<SimulateRailwayStation.train_num.length;i++){if(customer.getCustomerWilling()==i+1)SimulateRailwayStation.tickets[i]--;//对应票数减一}}//办理业务时间:打印票、交钱等thread.sleep((int)(Math.random()*SimulateRailwayStation.BUSINESS_DELAY)/2); releaseCustomer(customer);//顾客办理后离开。