以客户去银行存钱为例:
1. 客户通过排队取号来办法存钱业务,这里就有一个队列的,而且是阻塞的,因为只有排在前面的客户办完业务之后才能轮到后面的客户,
2. 柜员工作人员比作为多个线程,多个线程同时运行,取队列里的客户,并为其办法存钱业务。
public class Customer { /** 客户名 */ private String name; /** 存钱数 */ private int savings; public Customer(String name, int savings) { this.name = name; this.savings = savings; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSavings() { return savings; } public void setSavings(int savings) { this.savings = savings; } public String toString() { return "Customer [name=" + name + "]"; } }
柜台工作人员:Counter
public class Counter implements Runnable { Bank bank = Bank.getInstance(); private String name; private String state; private int count = 0; public Counter( ) { this.state = CounterState.AVAILABLE; } public Counter(String name) { this.name = name; this.state = CounterState.AVAILABLE; } public void deposit(Customer c) { System.out.println(System.currentTimeMillis() +":【" + Thread.currentThread().getName() + "】" + ":开始给【" + c.getName() + "】存钱"); this.setState(CounterState.BUSY); try { Thread.sleep((long) (Math.random() * 100)); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (Counter.class) { bank.setTotalDeposit(Bank.getInstance().getTotalDeposit() + c.getSavings()); } System.out.println(System.currentTimeMillis() +":【" + Thread.currentThread().getName() + "】" + ":给【" + c.getName() + "】存钱完毕!"); this.setState(CounterState.AVAILABLE); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getState() { return state; } public void setState(String state) { this.state = state; } public void run() { exec(); } public void exec() { while (Bank.getInstance().getQueue() != null && !Bank.getInstance().getQueue().isEmpty()) { if (CounterState.AVAILABLE.equals(this.getState())) { Customer c = Bank.getInstance().getQueue().poll(); this.deposit(c); } else { //System.out.println("" + Thread.currentThread().getName() + "还在给别人存钱"); } } this.setState(CounterState.OFFWORK); System.out.println(Thread.currentThread().getName() + "下班..."); } public int getCount() { return count; } public void setCount(int count) { this.count = count; } }
银行网点(单例):
public class Bank { private volatile static Bank bank; private int totalDeposit = 0; private Queue<Customer> queue; public static Bank getInstance() { if (bank == null) { synchronized (Bank.class) { bank = new Bank(); } } return bank; } private Bank() { } public int getTotalDeposit() { return totalDeposit; } public void setTotalDeposit(int totalDeposit) { this.totalDeposit = totalDeposit; } public Queue<Customer> getQueue() { return queue; } public void setQueue(Queue<Customer> queue) { this.queue = queue; } }
主线程:
public class Deposit { public static void main(String[] args) { long start = System.currentTimeMillis(); Queue<Customer> q = new ConcurrentLinkedQueue<Customer>(); for (int i = 1; i <= 1000; i++) { q.add(new Customer("客户" + i, i)); } Bank.getInstance().setQueue(q); Counter[] counters = new Counter[10]; Thread[] threads = new Thread[10]; for(int i = 0;i<counters.length;i++) { counters[i] = new Counter("Counter"+i); threads[i] = new Thread(counters[i]); threads[i].setName("Thread" + i); threads[i].start(); } while(true) { if(q.isEmpty()) { boolean flag = true; for (int j = 0; j < counters.length; j++) { if(!CounterState.OFFWORK.equals(counters[j].getState()) ){ flag = false; } } if(flag) { break; } } } System.out.println("所有队伍已排完,并且柜员处理完所有客户的存款,总共存钱:" + Bank.getInstance().getTotalDeposit()); System.out.println("总用时:" + (System.currentTimeMillis() - start)); } }
相关推荐
使用Java多线程,实现模拟银行存款与取款操作的实例。
java语言,编写一个简单 银行存款系统,无界面系统。。 对学习多线程有一定的帮助、
程序设计专题训练中多线程银行ATM模拟程序,主要实现了自动取款机的一些常规草最,包括取款,修改密码,存款等
3.假设某家银行,它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额。现有两个顾客, //每人都分3次,每次100元将钱到入。 试编写一个程序,模拟实际作业。
Java多线程实践,在不同的时间段实现多个客户对银行进行存钱和取钱的过程。
1) 多线程技术 2) 网络编程技术 3) 需要完成服务端的编程,负责完成接收客户端的请求和相关业务处理。 注意:如何保证多个客户端同时登陆,并且保证业务数据在冲突的情况下,不能受到破坏。 提示:客户端和...
二、ATM 系统使用的开发语言 人们在 ATM 系统的开发时,使用了各种不同的计算机语言,本系统采用 Java 语言作 为开发语言,因为 Java 语言是一个具有简单、面向对象、多线程、分布性、体系结构中 立、安全性等方面...
银行账户是开展各项金融业务的基础,是...了JAVA 跨平台、多线程、安全、动态等特点。总之,本系统设计开发的过 程,是对JAVA 应用基础与面向对象程序设计的实践和检验,是对我们所学 专业知识的综合性应用和全面提高。
多线程模拟客户,这是本人的拙作,对于初学者有个借鉴吧。
多线程银行ATM模拟程序 要求:使用图形用户界面。当输入给定的账户和密码时,系统能登录ATM柜员机系统, 并按照相应规则获得服务。 . ATM 系统分成服务器和客户机两个部分,服务器相当于银行的服务器,客户机相当于 ...