看了這個有趣的例子,你就秒懂多執行緒同步了
阿新 • • 發佈:2020-05-27
[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