- 购票的小例子
- 利用Vector集合 线程安全 多个线程并发操作同一个集合的时候 不会抢夺资源
package com.uncle.testthread.system12306;
public class TestMain {
public static void main(String[] args){
Window w1 = new Window("北京北站");
Window w2 = new Window("北京西站");
Window w3 = new Window("北京南站");
w1.start();
w2.start();
w3.start();
}
}
package com.uncle.testthread.system12306;
import java.util.Vector;
public class System12306 {
private System12306(){}
private static System12306 sys = new System12306();
public static System12306 getInstance(){
return sys;
}
private Vector<Ticket> tickets = new Vector<>();
{
for(int i=10;i<100;i++){
tickets.add(new Ticket("北京"+i,"深圳"+i,(i%5+5)*25F));
}
}
public Ticket getTicket(){
try {
return tickets.remove(0);
}catch (Exception e){
return null;
}
}
}
package com.uncle.testthread.system12306;
public class Ticket {
private String start;
private String end;
private Float price;
public Ticket(){}
public Ticket(String start,String end,Float price){
this.start=start;
this.end=end;
this.price=price;
}
public String toString(){
StringBuilder builder = new StringBuilder("[");
builder.append(this.start);
builder.append("-->");
builder.append(this.end);
builder.append(":");
builder.append(this.price);
builder.append("]");
return builder.toString();
}
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 Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
}
package com.uncle.testthread.system12306;
public class Window extends Thread {
private String windowName;
public Window(String windowName){
this.windowName=windowName;
}
public void run(){
this.sellTicket();
}
public void sellTicket(){
while(true){
System12306 sys = System12306.getInstance();
Ticket ticket = sys.getTicket();
if(ticket==null){
System.out.println("对不起"+windowName+"窗口车票已售完");
break;
}
System.out.println("从"+windowName+"售出:"+ticket);
}
}
}