- Warto by trochę zmienić kod metody work, aby rzeczywiście można tam przekazać
coś do zrobienia
:
public boolean work(String user, Runnable thisMustBeDone) throws InterruptedException {
long startTime = new Date().getTime();
if (tryLogin(user) && tryPassRequestFromUser(user, startTime) && trySendRequest(user, startTime)) {
thisMustBeDone.run();
return true;
} else {
return false;
}
}
- A wtedy, korzystając z semaforów(!) można zrobić test:
@Test
public void testConcurrency() throws InterruptedException {
final int maxNumberOfUsers = 2;
final int maxNumberOFRequestsPerUser = 3;
final int maxNumberOfRequests = 4;
final long waitTimeInMillis = 2000;
final Semaphore holdSemaphore = new Semaphore(0);
final RequestsLimiter limiter = new RequestsLimiter(
maxNumberOfUsers,
maxNumberOFRequestsPerUser,
maxNumberOfRequests,
waitTimeInMillis
);
final int testThreads = 20;
IntStream.range(0, testThreads).forEach(
i -> {
new Thread( () -> {
try {
limiter.work("user" + i, () -> {
System.out.println("start work for :" + i);
holdSemaphore.acquireUninterruptibly();
System.out.println("end work for :" + i);
});
} catch (InterruptedException ie ){ }
}
).start();
});
Thread.sleep(10);
System.out.println("waiting " + holdSemaphore.getQueueLength());
assertTrue( holdSemaphore.getQueueLength() <= maxNumberOfRequests);
holdSemaphore.release(testThreads);
}
Jak widać: etwas ist nein ja
. Trochę jest tych błedów, ale to już sobie znajdziesz pewnie...