From 0d2a6e4eba897e1a4f57aa987779aae183f3b7ce Mon Sep 17 00:00:00 2001 From: Ruben Dijkstra Date: Tue, 19 Jul 2016 15:03:02 +0200 Subject: [PATCH] Extract class for Thread Safety checks --- .../core/CycleClassInitDependencyTest.java | 14 ++++---- .../querydsl/core/testutil/ThreadSafety.java | 35 +++++++++++++++++++ 2 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 querydsl-core/src/test/java/com/querydsl/core/testutil/ThreadSafety.java diff --git a/querydsl-core/src/test/java/com/querydsl/core/CycleClassInitDependencyTest.java b/querydsl-core/src/test/java/com/querydsl/core/CycleClassInitDependencyTest.java index 1ceb04c12..337e3200e 100644 --- a/querydsl-core/src/test/java/com/querydsl/core/CycleClassInitDependencyTest.java +++ b/querydsl-core/src/test/java/com/querydsl/core/CycleClassInitDependencyTest.java @@ -9,6 +9,8 @@ import org.junit.BeforeClass; import org.junit.Test; import org.reflections.util.ClasspathHelper; +import com.querydsl.core.testutil.ThreadSafety; + public class CycleClassInitDependencyTest { private static ClassLoader loader; @@ -27,16 +29,12 @@ public class CycleClassInitDependencyTest { } @Test(timeout = 2000) - public void test() throws InterruptedException { + public void test() { // each thread wants to load one part of the dependency circle - Thread t1 = new Thread(new LoadClassRunnable("com.querydsl.core.types.dsl.NumberExpression")); - Thread t2 = new Thread(new LoadClassRunnable("com.querydsl.core.types.dsl.Expressions")); - t1.start(); - t2.start(); - - t1.join(); - + ThreadSafety.check( + new LoadClassRunnable("com.querydsl.core.types.dsl.NumberExpression"), + new LoadClassRunnable("com.querydsl.core.types.dsl.Expressions")); } private static class LoadClassRunnable implements Runnable { diff --git a/querydsl-core/src/test/java/com/querydsl/core/testutil/ThreadSafety.java b/querydsl-core/src/test/java/com/querydsl/core/testutil/ThreadSafety.java new file mode 100644 index 000000000..2fda718b4 --- /dev/null +++ b/querydsl-core/src/test/java/com/querydsl/core/testutil/ThreadSafety.java @@ -0,0 +1,35 @@ +package com.querydsl.core.testutil; + +import java.util.Collection; +import java.util.List; +import java.util.concurrent.*; + +import com.google.common.collect.Lists; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.MoreExecutors; + +public final class ThreadSafety { + + private ThreadSafety() { } + + public static void check(Runnable... runnables) { + Collection> callables = Lists.newArrayListWithCapacity(runnables.length); + ExecutorService executor = MoreExecutors.getExitingScheduledExecutorService( + new ScheduledThreadPoolExecutor(runnables.length)); + + for (Runnable runnable : runnables) { + callables.add(Executors.callable(runnable)); + } + List> result; + try { + result = executor.invokeAll(callables); + } catch (InterruptedException ex) { + throw new RuntimeException(ex); + } + + for (Future each : result) { + // all need to complete successfully + Futures.getUnchecked(each); + } + } +}