-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBuilding.java
More file actions
221 lines (191 loc) · 7.68 KB
/
Building.java
File metadata and controls
221 lines (191 loc) · 7.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
package classes;
import classes.elements.*;
import sql.NameGenerator;
import java.util.Calendar;
import java.util.*;
public class Building extends Outputter implements Runnable {
protected List<Floor> floors = new ArrayList<>(); // этажи
protected List<Elevator> elevators = new ArrayList<>(); // лифты
private final int passcount; // сколько создать пассажиров в здании
protected final int capacity; // вместимость лифтов
private final int source; // на каком этаже создаются пассажиры (0 - на случайном)
private final int destination; // на каком этаже выгружаются пассажиры (0 - на случайном)
private long passid = 1000; // начальный id пассажиров
protected int elevid = 200; // начальный id лифтов
protected int floorcount;
protected int elevcount;
private boolean passGeneratorActive = false;
private final long buildingCreateTime = Calendar.getInstance().getTimeInMillis();
private NameGenerator names; // генератор имен и фамилий пассажиров + сборщик статистики
public boolean isPassGeneratorActive() {
return passGeneratorActive;
}
public Building(int floorcount, int passcount, int elevcount, int capacity, int source, int destination) {
this.floorcount = floorcount;
this.elevcount = elevcount;
this.passcount = passcount;
this.capacity = capacity;
this.source = source;
this.destination = destination;
names = new NameGenerator(elevcount, floorcount, passcount, capacity);
}
public void start() {
for(int i=0;i<floorcount;i++) {
addFloor(i + 1);
outprintf("Добавлен новый этаж: %d\n", i+1);
}
Thread t = new Thread(this, "Здание с лифтами");
for(int i=0;i<elevcount;i++)
addElevator(i + 1);
t.start();
}
protected Floor floorGenerator(int number) {
return new Floor(number, this);
}
public Building addFloor(int number) {
floors.add(floorGenerator(number));
return this;
}
protected Elevator elevatorGenerator(int number) {
return new Elevator(number, floors.get(0), ++elevid, capacity,this);
}
public Building addElevator(int number) {
elevators.add(elevatorGenerator(number));
outprintf("Появился новый лифт %d! Всего лифтов: %d\n", elevid, elevators.size());
return this;
}
private int getRandomFloor() {
return (int)(Math.random()*floors.size());
}
public Passenger generatePassenger() {
Floor f0, f1;
if(source==0) { // если задано, что этаж выбирается случайно
f0 = floors.get(getRandomFloor()); // откуда едет
if(destination==0) {
f1 = floors.get(getRandomFloor()); // куда едет
while (f1.equals(f0)) // не едет ли на этаж, с которого стартовал
f1 = floors.get(getRandomFloor());
}
else {
f1 = floors.get(destination - 1);
while(f1.equals(f0)) {
f0 = floors.get(getRandomFloor());
}
}
}
else {
f0 = floors.get(source - 1);
if(destination==0) {
f1 = floors.get(getRandomFloor()); // куда едет
while (f1.equals(f0)) // не едет ли на этаж, с которого стартовал
f1 = floors.get(getRandomFloor());
}
else
f1 = floors.get(destination - 1);
}
Passenger p = f0.addPassenger(f1, ++passid, names);
drawPassenger(p);
return p;
}
// пустой класс - Fx класс рисует пассажира
protected void drawPassenger(Passenger p) {};
public int getPasscount() {
int r=0;
for(Floor f:floors) {
r+=f.getPassengers().size();
}
return r;
}
// проверка - есть ли еще работающие лифты
// вызывается когда пассажиров больше не осталось
// если работающих лифтов нет и пассажиров нет - закончить выполнение
public boolean checkActiveElevators(Elevator elevator) {
boolean active = true;
boolean allstopped = false;
for(Elevator e: elevators) {
active &= e.isActive();
allstopped |= !e.isActive();
}
if(allstopped)
stopService();
return active;
}
protected void stopService() {};
public void killService() {
for(Elevator e: elevators) {
e.setInActive();
}
passGeneratorActive = false;
stopService();
}
public NameGenerator getNames() {
return names;
}
@Override
public void run() {
Date d1 = new Date();
long d2 = d1.getTime()+2000;
while(d2>d1.getTime()) {
d1 = new Date();
}
try {
int i=0;
passGeneratorActive = true;
while((i<passcount) && passGeneratorActive) {
generatePassenger();
Thread.sleep(100);
i++;
}
}
catch (InterruptedException ex) {
outprintln("Генератор пассажиров прерван");
}
finally {
passGeneratorActive = false;
names.close();
}
outprintln("Генератор пассажиров завершил работу");
}
// находит первый этаж, на котором есть пассажиры
public Floor getFloorWithPassengers(Elevator elevator) {
switch (elevator.getStrategyMoving()) {
case MIN_STRATEGY:
for(Floor f:floors) {
if(f.getPassengers().size()>0)
return f;
}
break;
case MAX_STRATEGY:
for(int i=floorcount-1;i>=0;i--) {
if(floors.get(i).getPassengers().size()>0)
return floors.get(i);
}
break;
case RANDOM_STRATEGY:
Random r = new Random();
int next;
int maxrandom = floorcount*2;
do {
next = r.nextInt(floorcount);
maxrandom--;
} while (floors.get(next).getPassengers().size()==0 && maxrandom>0);
if(maxrandom>0)
return floors.get(next);
else
return null;
}
return null;
}
@Override
public void outprintln(String message) {
System.out.println(message);
}
@Override
public void outprintf(String format, Object... args) {
if(!format.substring(0,1).equals("#"))
System.out.printf(format, args);
}
public long getTimer() {
return Calendar.getInstance().getTimeInMillis() - buildingCreateTime;
}
}