A handy helper method for running "N" foreground tasks in Java with a timeout. A more sophisticated technique would permit examination of job status:
/** * Invokes <var>n</var> copies of the given <var>runnable</var>, timing out * after <strong>10 unit</strong> with {@code InterruptedException}. * * @param n the number of threads to run * @param runnable the thread body to execute * @param timeout the timeout * @param unit the timeout unit * * @throws InterruptedException if timed out */ public static void invokeNCopiesWithTimeout(final int n, final Runnable runnable, final long timeout, final TimeUnit unit) throws InterruptedException { final ExecutorService pool = newFixedThreadPool(n); pool.invokeAll( Collections.<Callable<Void>>nCopies(n, new Callable<Void>() { public Void call() { runnable.run(); return null; } })); pool.awaitTermination(timeout, unit); }
I find this particularly useful for blackbox concurrency testing. I run, say, 100 threads which both read and write to a common data structure, and accept the lack of exceptions as empirical evidence of safeness. (In truth, it only provides a comfort zone, not a proof. Reasoning about threads is difficult when maintaining disparate interacting components.)
No comments:
Post a Comment