JAVA多線程(二)Java多線程之火車票

1. JAVA多線程(二)Java多線程之火車票

  需求如下:鐵道部發布了一個售票任務,要求銷售10張票,要求有4個窗口來進行銷售,請編寫多線程程序來模擬這個效果

  • 第001窗口,正在售票,票號:1
  • 第004窗口,正在售票,票號:2
  • 第002窗口,正在售票,票號:3
  • 第003窗口,正在售票,票號:4

1.1 繼承Thread類多線程進行售票

繼承Thread類的方式創建多線程進行售票的方式,在不加鎖的情況下,每一個窗口都獨立個體,數據沒有共享。(四個窗口都賣了10張票,這顯然不是我們想的結果),代碼如下

package com.yuanxw.chapter2;
/**
 * 火車票售票
 */
public class RailwayStation {
    public static void main(String[] args) {
        TicketWindow ticketWindow1 = new TicketWindow("001窗口");
        TicketWindow ticketWindow2 = new TicketWindow("002窗口");
        TicketWindow ticketWindow3 = new TicketWindow("003窗口");
        TicketWindow ticketWindow4 = new TicketWindow("004窗口");

        ticketWindow1.start();
        ticketWindow2.start();
        ticketWindow3.start();
        ticketWindow4.start();
    }
}
package com.yuanxw.chapter2;
/**
 * 售票窗口
 * @author yuanxw
 */
public class TicketWindow  extends Thread {
    /** 最大售數 **/
    private final int MAX_NUMBER = 10;
    /** 當前售數 **/
    private int currentNumber = 1;
    /** 窗口名稱 **/
    private String name;

    public TicketWindow(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        while (currentNumber <= MAX_NUMBER){
            System.out.println(String.format("第%s,正在售票,票號:%s", name,currentNumber++));
        }
    }
}

執行結果:

第001窗口,正在售票,票號:1
第002窗口,正在售票,票號:1
第003窗口,正在售票,票號:1
第001窗口,正在售票,票號:2
第004窗口,正在售票,票號:1
第003窗口,正在售票,票號:2
第001窗口,正在售票,票號:3
第003窗口,正在售票,票號:3
第001窗口,正在售票,票號:4
第003窗口,正在售票,票號:4
第002窗口,正在售票,票號:2
第001窗口,正在售票,票號:5
第003窗口,正在售票,票號:5
第002窗口,正在售票,票號:3
第004窗口,正在售票,票號:2
第003窗口,正在售票,票號:6
第002窗口,正在售票,票號:4
第001窗口,正在售票,票號:6
第003窗口,正在售票,票號:7
第002窗口,正在售票,票號:5
第001窗口,正在售票,票號:7
第004窗口,正在售票,票號:3
第002窗口,正在售票,票號:6
第001窗口,正在售票,票號:8
第003窗口,正在售票,票號:8
第002窗口,正在售票,票號:7
第001窗口,正在售票,票號:9
第003窗口,正在售票,票號:9
第002窗口,正在售票,票號:8
第004窗口,正在售票,票號:4
第001窗口,正在售票,票號:10
第002窗口,正在售票,票號:9
第003窗口,正在售票,票號:10
第004窗口,正在售票,票號:5
第002窗口,正在售票,票號:10
第004窗口,正在售票,票號:6
第004窗口,正在售票,票號:7
第004窗口,正在售票,票號:8
第004窗口,正在售票,票號:9
第004窗口,正在售票,票號:10

1.2 實現Runnable接口多線程進行售票

實現Runnable接口的方式將我們可執行的邏輯單元和我們的線程控制分離,Runnable接口更加適合多個相同線程處理同一份資源的情況。

package com.yuanxw.chapter2;
/**
 * 高鐵站售票
 */
public class HighSpeedRailStation {
    public static void main(String[] args) {
        TicketWindowRunnable ticketWindowRunnable = new TicketWindowRunnable();
        Thread thread1 = new Thread(ticketWindowRunnable,"001窗口");
        Thread thread2 = new Thread(ticketWindowRunnable,"002窗口");
        Thread thread3 = new Thread(ticketWindowRunnable,"003窗口");
        Thread thread4 = new Thread(ticketWindowRunnable,"004窗口");

        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
    }
}
package com.yuanxw.chapter2;
/**
 * 實現Runnable方式售票
 */
public class TicketWindowRunnable implements Runnable {
    /** 最大售數 **/
    private final int MAX_NUMBER = 10;
    /** 當前售數 **/
    private int currentNumber = 1;

    @Override
    public void run() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        while (currentNumber <= MAX_NUMBER){
            System.out.println(String.format("第%s,正在售票,票號:%s", Thread.currentThread().getName(),currentNumber++));
        }
    }
}

執行結果:

第001窗口,正在售票,票號:2
第002窗口,正在售票,票號:3
第004窗口,正在售票,票號:1
第003窗口,正在售票,票號:4
第001窗口,正在售票,票號:5
第002窗口,正在售票,票號:6
第004窗口,正在售票,票號:7
第001窗口,正在售票,票號:9
第002窗口,正在售票,票號:10
第003窗口,正在售票,票號:8

    – 以上爲《JAVA多線程(二)Java多線程之火車票》,如有不當之處請指出,我後續逐步完善更正,大家共同提高。謝謝大家對我的關注。

——厚積薄發(yuanxw)

發佈了125 篇原創文章 · 獲贊 166 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章