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));

	}

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值