Java語言多執行緒實現一個火車站賣票系統
要實現買票系統,一定要用到多執行緒,因為火車站售票處不可能只有一個賣票口。那麼如何防止兩個口或多個口同時賣出一張票就是一個必須解決的問題。這裡我們可以用到synchrnized同步程式碼塊也就是鎖,來解決這個問題。
synchrnized:同步,可以修飾程式碼塊和方法,修飾的程式碼塊或方法一旦被某個執行緒訪問,則直接鎖住,其他執行緒將無法訪問,只能等著,簡言之:就是一把鎖
synchrnized(鎖物件)
{
程式碼塊
}
注意: 鎖物件需要對所有執行緒共享
同步: 安全性高 效率低
非同步:效率高 安全性低
也可以給方法前加synchrnized修飾符,把整個方法都變成同步方法。
下面是實現售票系統的程式碼:
package maipiao;
public class tickets {
@Override
public String toString() {
return “[”+start + “->” + end + “, price=” + price + “]”;
}
public String getStart() {
return start;
}
public void setStart(String start) {
this.start = start;
}
public String getEnd() {
return end;
}
public void setEnd(String end) {
this.end = end;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
private String start;
private String end;
private int price;
public tickets(String start, String end, int price) {
super();
this.start = start;
this.end = end;
this.price = price;
}
public tickets() {}
}
package maipiao;
import java.util.ArrayList;
public class xitong {
public xitong() {}
private ArrayList<tickets> list = new ArrayList<>();
private String[] start = {"哈爾濱","廣東","湖南","安徽","北京"};
private String[] end = {"深圳","澳門","臺灣","香港"};
public void addliebiao()
{
for(int i=0;i<100;i++) {
int r1 = (int) (Math.random()*start.length);
int r2 = (int)(Math.random()*end.length);
int price = (r1*r2)+100;
list.add(new tickets(start[r1],end[r2],price));
}
}
public tickets getTickets() {
return list.size() == 0 ? null : list.remove(0);
}
}
package maipiao;
public class chuangkou implements Runnable {
public void run() {
try {
method();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private synchronized void method() throws InterruptedException {
Thread.sleep(100);
xitong xt = new xitong();
xt.addliebiao();
while(true){
tickets ticket = xt.getTickets();
if(ticket==null) {
System.out.println("抱歉"+Thread.currentThread().getName()+"票已經售完");
break;
}else {
System.out.println("從"+Thread.currentThread().getName()+"賣出"+ticket+"的票");
}
}
}
}
相關文章
- 多執行緒賣火車票簡單例子執行緒單例
- 多執行緒—賣票執行緒
- 利用多執行緒寫一個賣票程式執行緒
- JAVA學習筆記之 多執行緒賣票Java筆記執行緒
- Java多執行緒之併發安全經典案例-賣票Java執行緒
- 執行緒鎖 -賣票機制執行緒
- Java多執行緒實現方式Java執行緒
- Java多執行緒的實現Java執行緒
- Java+SpringBoot+vue+element實現火車訂票平臺管理系統JavaSpring BootVue
- 多執行緒實現多工一執行緒
- 執行緒Thread練習題1買票,使用多執行緒的方式模擬四個視窗賣100張票執行緒thread
- Java語言深入 多執行緒程式模型研究(轉)Java執行緒模型
- java實現多執行緒的方法Java執行緒
- Java多執行緒的實現方法Java執行緒
- 建設一個靠譜的火車票網上訂購系統
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- Java多執行緒(一)多執行緒入門篇Java執行緒
- Java多執行緒【三種實現方法】Java執行緒
- Java多執行緒-基礎及實現Java執行緒
- JAVA多執行緒下載的實現Java執行緒
- go語言多執行緒入門筆記-執行緒同步Go執行緒筆記
- 多執行緒-實現Runnable介面的方式賣電影票案例執行緒
- Java多執行緒——執行緒Java執行緒
- Java多執行緒之一Java執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- 執行緒池的原理與C語言實現執行緒C語言
- Java實現多執行緒的三種方式Java執行緒
- 使用Java實現多執行緒程式設計Java執行緒程式設計
- 如何實現多執行緒執行緒
- 多執行緒原理實現執行緒
- Java多執行緒之守護執行緒實戰Java執行緒
- java多執行緒與併發 - 自己實現一個簡單的鎖(實現Lock介面)Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒
- 多執行緒實現多工二執行緒
- Java多執行緒詳解——一篇文章搞懂Java多執行緒Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- C語言 之 多執行緒程式設計C語言執行緒程式設計