package games.strategy.thread; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Collection; import org.junit.Test; public class ThreadPoolTest { @Test public void testRunOneTask() { final ThreadPool pool = new ThreadPool(50); final Task task = new Task(); pool.runTask(task); pool.waitForAll(); assertTrue(task.isDone()); } @Test public void testSingleThread() { final ThreadPool pool = new ThreadPool(1); final Collection<Task> tasks = new ArrayList<>(); for (int i = 0; i < 30; i++) { final Task task = new Task(); tasks.add(task); pool.runTask(task); } pool.waitForAll(); for (final Task runnable : tasks) { assertTrue(runnable.isDone()); } pool.shutDown(); } @Test public void testSimple() { final ThreadPool pool = new ThreadPool(5); final Collection<Task> tasks = new ArrayList<>(); for (int i = 0; i < 3000; i++) { final Task task = new Task(); tasks.add(task); pool.runTask(task); } pool.waitForAll(); for (final Task task1 : tasks) { assertTrue(task1.isDone()); } pool.shutDown(); } @Test public void testBlocked() { final Collection<Thread> threads = new ArrayList<>(); for (int j = 0; j < 50; j++) { final Runnable r = new Runnable() { @Override public void run() { threadTestBlock(); } }; final Thread t = new Thread(r); threads.add(t); t.start(); } for (final Thread thread : threads) { try { thread.join(); } catch (final InterruptedException e) { // ignore interrupted exception } } } private static void threadTestBlock() { final ThreadPool pool = new ThreadPool(2); final ArrayList<BlockedTask> blockedTasks = new ArrayList<>(); for (int i = 0; i < 10; i++) { final BlockedTask task = new BlockedTask(); blockedTasks.add(task); pool.runTask(task); } pool.waitForAll(); for (final BlockedTask task : blockedTasks) { assertTrue(task.isDone()); } pool.shutDown(); } private static class Task implements Runnable { private boolean done = false; public synchronized boolean isDone() { return done; } @Override public void run() { try { Thread.sleep(0, 1); } catch (final InterruptedException e) { throw new IllegalStateException(e); } done = true; } } private static class BlockedTask extends Task { @Override public void run() { synchronized (this) { try { wait(10); } catch (final InterruptedException ie) { Thread.currentThread().interrupt(); } super.run(); } } } }