以客户去银行存钱为例:
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));
}
}