简单就是很简单模拟一下...(简单也写了好久..synchronized使用的位置真的很重要..)
业务描述 假设有200张票,用4个线程去订票,不能有两个或者以上的线程订到了 同一个票(原因就不说了),当最后一张票卖掉的时候结束,再订就抛 异常提示出票卖完了。 业务分析,要实现以上功能, 1、需要创建一个车票类,初始化票,卖票的接口saleTicket() 2、自定义异常的一个类。 3、创建卖票线程类,在run方法中卖车票。 4、初始化车票的线程,负责初始化车票,也就是初始化Ticket类中的数组。 5、创建主方法进行测试。
测试类
package test12306;
/*
java多线程模拟实现12306售票
业务描述
假设有200张票,用4个线程去订票,不能有两个或者以上的线程订到了
同一个票(原因就不说了),当最后一张票卖掉的时候结束,再订就抛
异常提示出票卖完了。
业务分析,要实现以上功能,
1、需要创建一个车票类,初始化票,卖票的接口saleTicket()
2、自定义异常的一个类。
3、创建卖票线程类,在run方法中卖车票。
4、初始化车票的线程,负责初始化车票,也就是初始化Ticket类中的数组。
5、创建主方法进行测试。
*/
public class Test011 {
public static void main(String[] args) {
Ticket[] tickets = new Ticket[200];
FormatTickets f = new FormatTickets(tickets);
Thread t1 = new SaleTicketThread(f);
Thread t2 = new SaleTicketThread(f);
Thread t3 = new SaleTicketThread(f);
Thread t4 = new SaleTicketThread(f);
t1.setName("一号卖票线程");
t2.setName("二号卖票线程");
t3.setName("三号卖票线程");
t4.setName("四号卖票线程");
f.start();
try {
f.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.start();
t2.start();
t3.start();
t4.start();
}
}
车票类
package test12306;
public class Ticket {
private double price;
private String station;
public Ticket() {
}
public Ticket(double price, String station) {
this.price = price;
this.station = station;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getStation() {
return station;
}
public void setStation(String station) {
this.station = station;
}
public String toString() {
return "Ticket{" +
"price=" + price +
", station='" + station + '\'' +
'}';
}
}
自定义异常类
package test12306;
public class MyException extends Exception{
public MyException(){}
public MyException(String s){
super(s);
}
}
卖票线程类
package test12306;
import com.sun.deploy.security.SelectableSecurityManager;
public class SaleTicketThread extends Thread implements SaleTicket{
FormatTickets f;
public SaleTicketThread(FormatTickets f) {
this.f = f;
}
public void run() {
while (f.i < 200) {
synchronized (f) {
saleTicket();
}
}
}
public void saleTicket() {
if (f.tickets[199] != null){
System.out.println(Thread.currentThread().getName() + "卖出" + f.tickets[f.i]);
f.tickets[f.i] = null;
f.i ++;
}else {
try {
throw new MyException("票卖完了");
} catch (MyException e) {
System.out.println(e.getMessage());
}
}
}
}
初始化车票线程类
package test12306;
import java.util.Arrays;
public class FormatTickets extends Thread{
Ticket[] tickets;
int i = 0;
public FormatTickets(Ticket[] tickets) {
this.tickets = tickets;
}
public void run(){
for (int i = 0; i < tickets.length; i ++){
tickets[i] = new Ticket(i,"大连站" + i);
}
}
}
还有个小接口..
package test12306;
public interface SaleTicket {
public void saleTicket();
}
输出结果分布很均匀,甚至有时候只有两个线程抢票了,不知道为什么,有没有大佬帮我看看...