Теоретическая конструкция:
У меня очень большой зал, где работает около 64 баристи (Threads).
За один раз приходит около 1000 клиентов, чтобы получить кофе.
Клиенты - немцы, поэтому они стоят в 64 цепях перед 64 баристи.
У каждого баристи в очереди будет около 15-16 клиентов.
Баристи очень быстрые,самый быстрый - около 10 мс, самый медленный - максимум 50 мс.
Каждый бариста работает по принципу «первым пришел-первым вышел».
Я моделирую это в Программе и ееЮнит-тест.
public class MassiveWorkTest {
private int timeFac = 10;
private int worksFinished = 0;
private boolean endCalled = false;
public void testBarista() {
byte baristi = (byte) 64;
BaristiQueuePool b = new BaristiQueuePool(baristi, "TestBarista", new Runnable() {
@Override
public void run() {
endCalled = true;
}
});
Random r = new SecureRandom();
long theoreticalWorkTime = 0;
for (int i = 0; i < 10000; i++) {
final int time = 10+r.nextInt(40);
theoreticalWorkTime += time;
b.execute(new Runnable() {
@Override
public void run() {
try {
Thread.currentThread().sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
theoreticalWorkTime /= baristi;
long theoreticalOverallTime = theoreticalWorkTime + theoreticalWorkTime / 5;
assert b.awaitTermination((int) theoreticalOverallTime, TimeUnit.MILLISECONDS);
assert endCalled;
assert worksFinished == 0;
}
}
Мой компьютер работает довольно быстро, но другие могут этого не делать.Я увеличиваю время ожидания на 20%.
Иногда 20% недостаточно, и тест не пройден.Это плохо, потому что кто-то не может строить.
Как рассчитать идеальное нерабочее время баристи?