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+SpringBoot+vue+element實現火車訂票平臺管理系統JavaSpring BootVue
- 執行緒鎖 -賣票機制執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- Java多執行緒(一)多執行緒入門篇Java執行緒
- 執行緒Thread練習題1買票,使用多執行緒的方式模擬四個視窗賣100張票執行緒thread
- Java多執行緒【三種實現方法】Java執行緒
- go語言多執行緒入門筆記-執行緒同步Go執行緒筆記
- 執行緒池的原理與C語言實現執行緒C語言
- Java多執行緒之一Java執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- 使用Java實現多執行緒程式設計Java執行緒程式設計
- Java實現多執行緒的三種方式Java執行緒
- Java實現多執行緒詳解一 ( 繼承Thread方式 )Java執行緒繼承thread
- Java多執行緒之守護執行緒實戰Java執行緒
- 如何實現多執行緒執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒詳解——一篇文章搞懂Java多執行緒Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- Java之實現多執行緒的方式三:實現Callable介面(結合執行緒池使用)Java執行緒
- C語言 之 多執行緒程式設計C語言執行緒程式設計
- 多執行緒實現多工二執行緒
- Java之實現多執行緒的方式一 :繼承Thread類Java執行緒繼承thread
- Java多執行緒檔案分片下載實現Java執行緒
- Java建立多執行緒的幾種方式實現Java執行緒
- JAVA多執行緒詳解(一)Java執行緒
- Java 多執行緒詳解(一)Java執行緒
- java多執行緒Java執行緒
- Java - 多執行緒Java執行緒
- java——多執行緒Java執行緒
- java 多執行緒Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- java多執行緒9:執行緒池Java執行緒