1 package cz.cuni.amis.tests;
2
3 import java.util.Collection;
4 import java.util.concurrent.CountDownLatch;
5 import java.util.concurrent.LinkedBlockingQueue;
6 import java.util.concurrent.ThreadPoolExecutor;
7 import java.util.concurrent.TimeUnit;
8
9 public class ConcurrencyTest extends BaseTest {
10
11 protected void runConcurrent(Collection<ConcurrentTask> tasks, int threads) {
12
13 CountDownLatch latch = new CountDownLatch(tasks.size());
14
15 for (ConcurrentTask task : tasks) {
16 task.setLatch(latch);
17 task.setLogger(log);
18 }
19
20 ThreadPoolExecutor executor = new ThreadPoolExecutor(threads, threads, 1000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
21
22 long time = System.currentTimeMillis();
23
24 try {
25 for (ConcurrentTask task : tasks) {
26 executor.execute(task);
27 }
28
29 try {
30 latch.await();
31 } catch (InterruptedException e) {
32 throw new RuntimeException("Interrupted.", e);
33 }
34
35 } finally {
36 executor.shutdownNow();
37 }
38
39 log.info("All tasks finished, time: " + (System.currentTimeMillis() - time) + " ms");
40
41 log.info("Checking thread exceptions...");
42
43 for (ConcurrentTask task : tasks) {
44 if (task.getException() != null) {
45 if (task.getException() instanceof RuntimeException) {
46 throw (RuntimeException)task.getException();
47 } else {
48 throw new RuntimeException("At least one task has finished with an exception.", task.getException());
49 }
50 }
51 }
52
53 log.info("All tasks executed OK");
54
55 }
56
57 }