`
jayung
  • 浏览: 58910 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java之多线程以客户去银行存钱为例

阅读更多

以客户去银行存钱为例:

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多线程,实现模拟银行存款与取款操作的实例。

    java 银行系统多线程

    java语言,编写一个简单 银行存款系统,无界面系统。。 对学习多线程有一定的帮助、

    java多线程银行ATM模拟程序

    程序设计专题训练中多线程银行ATM模拟程序,主要实现了自动取款机的一些常规草最,包括取款,修改密码,存款等

    用java多线程做的银行汇款问题

    3.假设某家银行,它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额。现有两个顾客, //每人都分3次,每次100元将钱到入。 试编写一个程序,模拟实际作业。

    Java时序银行系统.zip

    Java多线程实践,在不同的时间段实现多个客户对银行进行存钱和取钱的过程。

    (java se 代码)Bank Account Management System 银行账户管理子系统

    1) 多线程技术 2) 网络编程技术 3) 需要完成服务端的编程,负责完成接收客户端的请求和相关业务处理。 注意:如何保证多个客户端同时登陆,并且保证业务数据在冲突的情况下,不能受到破坏。 提示:客户端和...

    基于JAVA的模拟ATM系统的设计与实现【文献综述】.pdf

    二、ATM 系统使用的开发语言 人们在 ATM 系统的开发时,使用了各种不同的计算机语言,本系统采用 Java 语言作 为开发语言,因为 Java 语言是一个具有简单、面向对象、多线程、分布性、体系结构中 立、安全性等方面...

    C#写的银行帐户管理系统

    银行账户是开展各项金融业务的基础,是...了JAVA 跨平台、多线程、安全、动态等特点。总之,本系统设计开发的过 程,是对JAVA 应用基础与面向对象程序设计的实践和检验,是对我们所学 专业知识的综合性应用和全面提高。

    银行存取款的控制台程序

    多线程模拟客户,这是本人的拙作,对于初学者有个借鉴吧。

    ATM java程序

    多线程银行ATM模拟程序 要求:使用图形用户界面。当输入给定的账户和密码时,系统能登录ATM柜员机系统, 并按照相应规则获得服务。 . ATM 系统分成服务器和客户机两个部分,服务器相当于银行的服务器,客户机相当于 ...

Global site tag (gtag.js) - Google Analytics