1. 程式人生 > >看了這個有趣的例子,你就秒懂多執行緒同步了

看了這個有趣的例子,你就秒懂多執行緒同步了

[TOC] #### 寫在前面 - 把技術概念通過文字的形式寫下來,理清邏輯,加深認知; - 把知識點通過系列文章的形式分段寫下來,讓思維進行刻意的訓練; - 把難懂的東西通過有趣的故事或者例子講出來,讓技術變得生動。 #### 電影票的案例 ##### 單執行緒的例子 我們設定有一個電影院,該電影院開張不久,在入口的旁邊只設立了一個售票點A,顧客看電影,需要在售票點排隊依次買票,買完票後在入口處檢票進入電影院觀影。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200511164339295.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pwZ3podQ==,size_16,color_FFFFFF,t_70) 上面的描述用程式碼來實現,可以是這樣的: 1、首先建立一個電影票的類:主要的屬性有票的ID,哪個放映廳,哪一排哪一列,放映的電影名稱,放映時間及票價。 ```java /** * 通過賣票程式讀懂多執行緒--電影票的類 * * @author zhuhuix * @date 2020-05-12 */ public class Ticket { //id private int ticketId; //放映廳 private String room; //行 private Integer row; //列 private Integer col; //電影名 private String filmName; //價格 private BigDecimal price; //放映時間 private LocalDateTime datetime; private Ticket(){ } public Ticket(int ticketId,String room, Integer row, Integer col, String filmName, BigDecimal price, LocalDateTime datetime) { this.ticketId = ticketId; this.room = room; this.row = row; this.col = col; this.filmName = filmName; this.price = price; this.datetime = datetime; } public int getTicketId() { return ticketId; } public void setTicketId(int ticketId) { this.ticketId = ticketId; } public String getRoom() { return room; } public void setRoom(String room) { this.room = room; } public Integer getRow() { return row; } public void setRow(Integer row) { this.row = row; } public Integer getCol() { return col; } public void setCol(Integer col) { this.col = col; } public String getFilmName() { return filmName; } public void setFilmName(String filmName) { this.filmName = filmName; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public LocalDateTime getDatetime() { return datetime; } public void setDatetime(LocalDateTime datetime) { this.datetime = datetime; } @Override public String toString() { return "Ticket{" + "ticketId=" + ticketId + ", room='" + room + '\'' + ", row=" + row + ", col=" + col + ", filmName='" + filmName + '\'' + ", price=" + price + ", datetime=" + datetime + '}'; } } ``` 2、其次建立一個顧客的類:主要的屬性有票的ID,購買的電影票;成員方法有買票。 ```java /** * 通過賣票程式讀懂多執行緒--顧客類 * * @author zhuhuix * @date 2020-05-12 */ public class Customer { //顧客id private int customerId; //購買的電影票 private Ticket ticket; public Customer(int customerId) { this.customerId = customerId; } //顧客買票 public void buyTicket(Ticket ticket) { this.ticket = ticket; } public int getCustomerId() { return customerId; } public void setCustomerId(int customerId) { this.customerId = customerId; } public Ticket getTicket() { return ticket; } public void setTicket(Ticket ticket) { this.ticket = ticket; } @Override public String toString() { return "Customer{" + "customerId=" + customerId + ", ticket=" + ticket.toString() + '}'; } } ``` 3、最後寫一個主程式,生成電影票的列表,設定上門觀影的顧客人數,依次買票,輸出電影票購買的狀態。 ```java /** * 通過賣票程式讀懂多執行緒--單執行緒程式 * * @author zhuhuix * @date 2020-05-12 */ public class TicketSingle { private static final String ROOM = "中央放映廳"; private static final int ROW = 10; private static final int COL = 20; private static final String FILM_NAME = "戰狼3"; private static final BigDecimal PRICE = BigDecimal.valueOf(30); private sta