這次的銀行排隊我們稍作調(diào)整,調(diào)整就是銀行工作人員辦理業(yè)務的時候,在隊列里依次取出排隊人員,并且保證每個人員只能取出一次,不能被多個窗口取到,這就需要多線程了,每一個窗口就是一個獨立的線程,并且所有窗口去隊列里取排隊人員的時候,涉及到資源共享的問題,要將資源上鎖,也就是使用synchronized關鍵字,可以保證每一個排隊人員只被取到一次。
下面看看代碼和運行結(jié)果:
服務器:
public class QueueServer {
public Queue<Waiter> waiterlist = new LinkedList<Waiter>();
public Queue<GoldWaiter> goldwaiterlist = new LinkedList<GoldWaiter>();
public Queue<Waiter> init(){
Waiter w = null;
for(int i=1;i<50;i++){
w = new Waiter();
w.setNumber(i);
w.setFrontnumer(i-1);
waiterlist.offer(w);
}
return waiterlist;
}
public Queue<GoldWaiter> goldinit(){
GoldWaiter w = null;
for(int i=1;i<10;i++){
w = new GoldWaiter();
w.setNumber(i);
w.setFrontnumer(i-1);
goldwaiterlist.offer(w);
}
return goldwaiterlist;
}


}
測試類:
public class TestQueue implements Runnable{

QueueServer server = new QueueServer();
Queue<Waiter> waiterlist = server.init();
Queue<GoldWaiter> goldwaiterlist = server.goldinit();
public static void main(String[] args) {
TestQueue tq = new TestQueue();
Thread t1 = new Thread(tq,"1號窗口");
Thread t2 = new Thread(tq,"2號窗口");
Thread t3 = new Thread(tq,"3號窗口");
t1.start();
t2.start();
t3.start();
}
public synchronized void handBusiness(){
Waiter w = null;
GoldWaiter gw = null;
if(waiterlist!=null){
gw = goldwaiterlist.poll();
if(gw!=null){
System.out.println("尊敬的大爺,您的號碼是"+gw.getNumber()+" 請您到"+Thread.currentThread().getName()+"辦理業(yè)務");
}
else{
w = waiterlist.poll();
if(w!= null){
System.out.println("個人業(yè)務用戶,您的號碼是"+w.getNumber()+" 請您到"+Thread.currentThread().getName()+"辦理業(yè)務");
}
else{
System.out.println("現(xiàn)在沒有用戶辦理業(yè)務了,喝杯咖啡吧,哈哈");
}
}
}
}
public void run(){
for(int i=0;i<20;i++){
handBusiness();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
看看運行結(jié)果:
下面看看代碼和運行結(jié)果:
服務器:




























測試類:














































看看運行結(jié)果:
