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)