編寫Java程式,車站只剩 50 張從武漢到北京的車票,現有 3 個視窗售賣,用程式模擬售票的過程,使用Runnable解決執行緒安全問題

2020-09-28 13:00:39

檢視本章節

檢視作業目錄


需求說明:

車站只剩 50 張從武漢到北京的車票,現有 3 個視窗售賣,用程式模擬售票的過程,要求使用同步方法保證售票過程中票數的正確性

實現思路:

  1. 建立 Java 專案,在專案中建立 SellTicketBySync 類,並實現 Runnable 介面
  2. 定義 int 型別的變數 ticket,表示剩餘的車票數量,ticket 初始值為 50
  3. 建立同步方法 sellTicket()。在該方法體內,判斷 ticket 的值是否大於 0。如果 ticket 的值大於 0,則呼叫Thread.sleep(long mills) 方法,讓執行緒休眠 50 毫秒,並列印出當前視窗的售票情況
  4. 重寫 run() 方法。在 run() 方法內,定義一個 while 死迴圈。在迴圈體內,判斷變數 ticket 是否大於 0,如果 ticket 大於 0,呼叫 sellTicket() 方法。如果 ticket 小於等於 0,則結束迴圈
  5. 編寫測試類,使用 new Thread(Runnable target,String name) 構造方法,建立 3 條執行緒,引數 target的值為 runnableInstance,指定視窗名稱並賦值給引數 name。呼叫 3 個執行緒物件的 start() 方法,依次啟動 3條執行緒

實現程式碼:


public class SellTicketBySync implements Runnable {
	private int ticket = 50;//剩餘的票數
	//重寫run方法
	@Override
	public void run() {
		while (true) {
			if (this.ticket > 0) {
				SellTicket();
			} else {
				break;
			}
		}
	}
	public synchronized void SellTicket() {
		if (ticket > 0) {
			try {
				//執行緒休眠50毫秒
				Thread.sleep(50);
				System.out.println(Thread.currentThread().getName()+"出售第"+ticket--+"張車票");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		//建立一個Runnable範例
		SellTicketBySync sellTicketBySync = new SellTicketBySync();
		//建立3條執行緒,併為3條執行緒指定名稱
		Thread thread01 = new Thread(sellTicketBySync,"視窗1");
		Thread thread02 = new Thread(sellTicketBySync,"視窗2");
		Thread thread03 = new Thread(sellTicketBySync,"視窗3");
		thread01.start();
		thread02.start();
		thread03.start();
	}
}