用java实现银行排队程序,要求模拟银行的业务排队系统,要有界面,实现完成的排队和叫号

Python048

用java实现银行排队程序,要求模拟银行的业务排队系统,要有界面,实现完成的排队和叫号,第1张

import java.awt.Color

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.awt.event.WindowAdapter

import java.awt.event.WindowEvent

import javax.swing.ButtonGroup

import javax.swing.JButton

import javax.swing.JFrame

import javax.swing.JLabel

import javax.swing.JPanel

import javax.swing.JTextField

public class BankWaiting extends JFrame implements ActionListener {

int total = 0, now = 0

boolean is1Ready = false, is2Ready = false, is3Ready = false

int call1, call2, call3

JFrame jf

JLabel jr, jl, jl1, j2, jl2, j3, jl3

JTextField jr4

JButton jb, jb1, jb2, j1

JButton workBut1, workBut2, workBut3

JPanel jp, jp1, jp2

public BankWaiting() {

setLayout(null)

jf = new JFrame("银行叫号程序")// 窗体

jr = new JLabel("请**号到*号窗口办理业务")

jr.setBounds(300, 10, 800, 50)

jr.setForeground(Color.red)

j1 = new JButton("取号")

j1.addActionListener(this)

jr4 = new JTextField("欢迎")

jr4.setEditable(false)

ButtonGroup bg = new ButtonGroup()

bg.add(j1)

jp = new JPanel()

jl = new JLabel("一号窗口")

jl1 = new JLabel("一号窗口,欢迎你!")

jb = new JButton("下一位")

workBut1 = new JButton("开始办理")

workBut1.addActionListener(this)

jb.addActionListener(this)

jp.setBackground(Color.pink)

jp.setSize(200, 80)// 大小

jp.setLocation(20, 120)// 位置

jf.setLayout(null)

jp1 = new JPanel()

j2 = new JLabel("二号窗口")

jl2 = new JLabel("二号窗口,欢迎你!")

jb1 = new JButton("下一位")

workBut2 = new JButton("开始办理")

jb1.addActionListener(this)

workBut2.addActionListener(this)

jp1.setBackground(Color.pink)

jp1.setSize(200, 80)// 大小

jp1.setLocation(250, 120)// 位置

jf.setLayout(null)

jp2 = new JPanel()

j3 = new JLabel("三号窗口")

jl3 = new JLabel("三号窗口,欢迎你!")

jb2 = new JButton("下一位")

workBut3 = new JButton("开始办理")

workBut3.addActionListener(this)

jb2.addActionListener(this)

jp2.setBackground(Color.pink)

jp2.setSize(200, 80)// 大小

jp2.setLocation(500, 120)// 位置

jf.setLayout(null)

jf.add(jp)

jf.add(jp1)

jf.add(jp2)

jf.add(jr)

jp.add(jl)

jp.add(jl1)

jp.add(jb)

jp.add(workBut1)

jp1.add(j2)

jp1.add(jl2)

jp1.add(jb1)

jp1.add(workBut2)

jp2.add(j3)

jp2.add(jl3)

jp2.add(jb2)

jp2.add(workBut3)

jf.add(j1)

jf.add(jr4)

j1.setBounds(550, 300, 60, 30)

jr4.setBounds(300, 300, 200, 40)

jf.setSize(800, 600)

jf.setVisible(true)

jf.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0)

}

})

}

public void actionPerformed(ActionEvent e) {

String s = ""

if (e.getSource() == j1) {

s = "第" + (++total) + "号,前面还有" + (total - now - 1) + "位顾客!"

jr4.setText(s)

}

if (e.getSource() == jb) {

if (this.hasCustomers()) {

s = "请" + (++now) + "号顾客到一号窗口办理"

call1 = now

jl1.setText(s)

jr.setText(s)

is1Ready = true

} else {

s = "当前已经没有顾客了"

jl1.setText(s)

is1Ready = false

}

} else if (e.getSource() == jb1) {

if (this.hasCustomers()) {

s = "请" + (++now) + "号顾客到二号窗口办理"

call2 = now

jl2.setText(s)

jr.setText(s)

is2Ready = true

} else {

s = "当前已经没有顾客了"

jl2.setText(s)

is2Ready = false

}

} else if (e.getSource() == jb2) {

if (this.hasCustomers()) {

s = "请" + (++now) + "号顾客到三号窗口办理"

call3 = now

jl3.setText(s)

jr.setText(s)

is3Ready = true

} else {

s = "当前已经没有顾客了"

jl3.setText(s)

is3Ready = false

}

}

if (e.getSource() == workBut1) {

if (is1Ready) {

s = call1 + "号顾客正在办理业务。。。"

jl1.setText(s)

is1Ready = false

}

} else if (e.getSource() == workBut2) {

if (is2Ready) {

s = call2 + "号顾客正在办理业务。。。"

jl2.setText(s)

is2Ready = false

}

} else if (e.getSource() == workBut3) {

if (is3Ready) {

s = call3 + "号顾客正在办理业务。。。"

jl3.setText(s)

is3Ready = false

}

}

}

public boolean hasCustomers() {

if (now <total) {

return true

} else {

return false

}

}

public static void main(String[] args) {

new BankWaiting()

}

}

这个简单。

先做几个实体

客户,售货员,

客户包括到达时间,完成目标需要的时间,开始操作的时间,结束的时间。

售货员包括当前正在服务的客户

开2个线程。一个是客户产生线程。

一个是售货员消费线程

中间用个公共寄存体queue。

客户产生线程每次产生一个带到达时间,完成目标时间的客户。

放倒队列里,并提醒售货员线程接收。

售货员线程空置则从队列里拿一个客户,当前时间=当前时间和客户到达的时间最大的一个。客户的开始操作时间=当前时间

结束时间=当前时间+需要时间。

处理完以后当前时间=结束时间。

如果队列空,售货员线程等待。

不为空就继续取。

注意所有处理过的客户都需要放到一个List里。

然后这一天结束了,就把整个List里的客户全部取出来,就算平均等待时间,各种时间。。。。这个会统计的吧。

要求追分

一、人数阀门设计:进行用户人群过滤。

商品数量只有100份,秒杀人数有10000人,那么我们就设计1道阀门(根据情况,可以设计3道或者2道都可以的)。

在整点的时候,我们对点击了“购买”按钮后,我们只运行500人进入信息填写页面,信息填写完成后提交订单。效果如下:

①商品详情点击购买(秒杀)--》②输入信息提交订单--》③进行支付

10000人 500人 (这里也可以设计阀门,只允许多少人进入支付)

其他未进入的如何处理乃?显示已抢完或者排队等待(这就是后面要提到的排队系统设计)。

二、会员排队设计:对用户进行排队,排在前面的先购买

这相当于是消息队列模式了,如果秒杀是立即知道结果,排队可能会有点鸡肋。

在第二步②输入信息提交订单后进行排队,排在前面的先购买,排在后面的后购买

三、问答问题设计:过滤掉一些反应慢的用户

在第一步①点击购买后跳转到问题页面,用户必须回答正确问题后,方可进入后面的流程

四、库存缓存设计:缓存库存,判断用户购买的商品是否还有,不读取数据库,速度快,也不会增加数据库负担,

经过前面的过滤,超卖的可能性比较低了提前将商品库存缓存起来,到下单购买的时候,用户购买了就减1,每次都通过库存缓存判断一下,如果为0就显示已抢完。

五、页面静态设计:尽量静态缓存化【CDN那些这里不做考虑】

第一步①商品详情页面,尽量进行缓存,减轻大批量用户在访问商品页面的时候,大量查询数据库。

问答问题页面:全静态,加载快,无数据库负担。

排队等待页面:全静态,加载快,无数据库负担。

排队结束页面:全静态,加载快,无数据库负担。