Java:假設車庫有3個車位(可以通過boolean[]陣列來表示車庫)可以停車,寫一個程式模擬多個使用者開車離開,停車入庫的效果。注意:車位有車時不能停車。
阿新 • • 發佈:2018-11-23
假設車庫有3個車位(可以通過boolean[]陣列來表示車庫)可以停車,寫一個程式模擬多個使用者開車離開,停車入庫的效果。注意:車位有車時不能停車。
1)使用阻塞佇列來實現(BlockingQueue<T>)
Producer類
package com.多執行緒停車問題; import java.util.concurrent.BlockingQueue; public class Producer extends Thread{ private BlockingQueue<Boolean>bq; private String name; public Producer(BlockingQueue<Boolean> bq, String name) { super(); this.bq = bq; this.name = name; } public void run(){ try{ bq.put(true); System.out.println(this.name+"停入"); }catch(InterruptedException e){ e.printStackTrace(); } } }
Consumer類
package com.多執行緒停車問題; import java.util.concurrent.BlockingQueue; public class Consumer extends Thread{ private BlockingQueue<Boolean> bq; public Consumer(BlockingQueue<Boolean> bq) { super(); this.bq = bq; } public void run(){ try{ bq.take(); System.out.println("駛出"); }catch(InterruptedException e){ e.printStackTrace(); } } }
測試類:只有當有車子駛出,也就是有空餘的停車位的時候,才能夠停車。只有有車子的時候才能駛出。
package com.多執行緒停車問題; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class Test { public static void main(String[]args){ BlockingQueue<Boolean>bq = new ArrayBlockingQueue<>(3); new Producer(bq,"摩托車").start(); new Producer(bq,"保時捷").start(); new Producer(bq,"寶馬").start(); new Producer(bq,"奧迪").start(); new Consumer(bq).start(); } }
2)使用synchronized同步實現
/*
* 定義一個停車場類,兩個執行緒共享停車場,利用同步停車場物件實現停車和出庫操作
* 當停車場滿時,wait(),等待取車操作
* 當停車場為空時,wait(),等待有車停入
*/
//停車場類
class Park{
boolean[] park = new boolean[3];
//state變數定義停車場的剩餘車輛
private int state =3;
public synchronized void CarIn(int i) {
try {
while(state==0) {
System.out.println("目前空餘車位為:"+state+"請等待");
wait();
}
System.out.println(i+"車位停車成功");
state=state-1;
System.out.println("目前剩餘車位為:"+state);
notify();
}
catch(InterruptedException e){
e.printStackTrace();
}
}
public synchronized void CarOut(int i) {
try {
while(state==3) {
//System.out.println("目前空餘車位為:"+state+"請等待");
wait();
}
System.out.println(i+"車駛出");
state=state+1;
System.out.println("目前剩餘車位為:"+state);
notify();
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}
class CarInThread extends Thread{
Park park=new Park();
public CarInThread(Park park) {
this.park=park;
}
public void run() {
super.run();
for(int i=1;i<5;i++){
park.CarIn(i);
}
}
}
class CarOutThread extends Thread{
Park park=new Park();
public CarOutThread(Park park) {
this.park=park;
}
public void run() {
super.run();
for(int i=1;i<5;i++){
park.CarOut(i);
}
}
}
public class SynchronizedTest {
public static void main(String[] args) {
Park park = new Park();
new CarInThread( park).start();
new CarOutThread(park).start();
}
}