package ticketingsystem;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.atomic.AtomicInteger;
public class TicketingDS implements TicketingSystem {
// Ticket ticket = new Ticket();
Seat seat;
List list;
AtomicInteger counter = new AtomicInteger(0);
int THREAD_EXE_NUM = 4;
int THREAD_NUM;
HashMap<Integer,Lock> test = new HashMap<>();
int count = 0;
Lock lock = new ReentrantLock();
public TicketingDS(int routenum, int coachnum, int seatnum, int stationnum, int threadnum) throws InterruptedException{
this.THREAD_NUM = threadnum;
TdsThread tdsThread[] = new TdsThread[THREAD_NUM];
TicketingDS tds = new TicketingDS(routenum, coachnum, seatnum, stationnum);
for (int i = 0; i < THREAD_NUM; i++) {
tdsThread[i] = new TdsThread(tds, THREAD_EXE_NUM);
tdsThread[i].start();
}
for (int i = 0; i< THREAD_NUM; i++) {
tdsThread[i].join();
}
long s = tdsThread[0].starttime;
long e = tdsThread[0].endtime;
double buytime = 1.0*(tdsThread[0].buytime)/(tdsThread[0].buycount);
double inqtime = 1.0*tdsThread[0].inqtime / (tdsThread[0].inqcount);
double reftime = 1.0*tdsThread[0].reftime / (tdsThread[0].refcount);
long a = 0;
for(int i=1;i<tdsThread.length;i++){
if(tdsThread[i].starttime<s)
s = tdsThread[i].starttime;
if(tdsThread[i].endtime>e)
e = tdsThread[i].endtime;
buytime = buytime + 1.0*tdsThread[i].buytime / tdsThread[i].buycount;
inqtime = inqtime + 1.0*tdsThread[i].inqtime / tdsThread[i].inqcount;
reftime = reftime + 1.0*tdsThread[i].reftime / tdsThread[i].refcount;
//System.out.println(i +" "+ 1.0*buytime/i);
a = a + tdsThread[i].buycount;
}
System.out.println(THREAD_NUM + "-Thread the longest execute time(Including print): "+(e-s)+" ms");
System.out.println("the Throughput rate(Including print):" + THREAD_NUM*THREAD_EXE_NUM/((e-s)/1000.0)+" req/s");
// System.out.println("the number of buy method: "+ a);
// System.out.println(buytime);
// System.out.println(tdsThread[3].inqtime);
// System.out.println(tdsThread[3].reftime);
// System.out.println(tdsThread[3].buycount);
// System.out.println(tdsThread[3].inqcount);
// System.out.println(tdsThread[3].refcount);
System.out.println("The average BuyTicket method time: "+buytime/THREAD_NUM);
System.out.println("The average Inquiry method time: "+inqtime/THREAD_NUM);
System.out.println("The average RefundTicket method time: "+reftime/THREAD_NUM);
System.out.println("Main Thread over!");
}
public TicketingDS(int routenum, int coachnum, int seatnum, int stationnum) {
seat = new Seat(routenum, seatnum, stationnum);
list = new List(routenum);
}
public class Seat{
private int seat[][][] =new int[5][800][11];
public Seat(int i,int j, int k ){
for(i=0; i<5; i++)
for(j=0; j<8*100; j++)
for (k=0; k<10; k++){
seat[i][j][k]=0;
}
}
public int getseat(int i, int j, int k){
return seat[i][j][k];
}
public void setseat(int i, int j, int k){
this.seat[i][j][k] = 1;
}
public void setseatZero(int i, int j, int k){
this.seat[i][j][k] = 0;
}
public void printseat(int i, int j, int k){
System.out.println(this.seat[i][j][k]);
}
}
public class List{
ArrayList<Long> List = new ArrayList<Long>();
public List(long i){};
public void addTid(long i){
List.add(i);
}
public void removeTid(long i){
List.remove(i);
}
public boolean containsTid(long i){
return List.contains(i);
}
}
@Override
public Ticket buyTicket(String passenger, int route, int departure, int arrival) {
Ticket ticket = new Ticket();
int count=0;
//ticket.tid = k*1000 + i/100+100 + i%100;
//long a = counter.getAndIncrement();
//ticket.tid =a*10000000 +route*10000000 + (i/100+1)*1000000 + (i%100+1)*1000+ticket.departure*100+ticket.arrival;
ticket.passenger = passenger;
ticket.route = route;
ticket.departure = departure;
ticket.arrival = arrival;
// System.out.println("routenum is" + this.routenum);
// System.out.println(route - 1);
lock.lock();
//����ÿһ����λ�����䡣�����ҵ���λ�������ڲ��ڱ��˵������ڡ�
try{for (int i = 0; i < 8*100; i++){
for(int p = departure-1; p < arrival; p++){
if(seat.getseat(route-1, i, p)==1)
// seat.printseat(route-1, i, p);
count++;
}
if (count==0){
ticket.coach = i/100+1;
ticket.seat = i%100+1;
ticket.tid = counter.incrementAndGet();
//System.out.println(ticket);
for(int p = departure-1; p < arrival; p++){
seat.setseat(route-1, i, p);
}
list.addTid(ticket.tid);
return ticket;
}
count = 0;
}
}finally {
this.lock.unlock();
}
return null;
}
@Override
public int inquiry(int route, int departure, int arrival) {
// TODO Auto-generated method stub
//Lock lock = new ReentrantLock();
int count = 0;
int num = 0;
System.out.println(route - 1);
for (int i = 0; i < 8*100; i++){
// this.lock[route - 1].lock();
for(int p = departure-1; p < arrival; p++){
if(seat.getseat(route-1, i, p)==1)
count++;
}
if(count ==0)
num++;
count = 0;
}
return num;
}
@Override
public boolean refundTicket(Ticket ticket) {
// TODO Auto-generated method stub
//Lock lock = new ReentrantLock();
int route = ticket.route;
int departure = ticket.departure;
int arrival = ticket.arrival;
int coach = ticket.coach;
int seat0 = ticket.seat;
int k = (coach-1) *100+(seat0-1);
System.out.println(route - 1);
// this.lock[route].lock();
if(list.containsTid(ticket.tid)){
for(int p = departure-1; p < arrival; p++){
seat.setseatZero(route-1, k, p);
//seat.printseat(route-1, k, p);
}
list.removeTid(ticket.tid);
// this.lock[route].unlock();
return true;
}
// this.lock[route].unlock();
return false;
}
}