1. 程式人生 > >Java:假設車庫有3個車位(可以通過boolean[]陣列來表示車庫)可以停車,寫一個程式模擬多個使用者開車離開,停車入庫的效果。注意:車位有車時不能停車。

Java:假設車庫有3個車位(可以通過boolean[]陣列來表示車庫)可以停車,寫一個程式模擬多個使用者開車離開,停車入庫的效果。注意:車位有車時不能停車。

假設車庫有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();
	}

}