15 |
|
import java.io.ObjectOutputStream; |
16 |
|
import java.lang.management.ManagementFactory; |
17 |
|
import java.lang.management.ThreadInfo; |
18 |
+ |
import java.lang.management.ThreadMXBean; |
19 |
|
import java.lang.reflect.Constructor; |
20 |
|
import java.lang.reflect.Method; |
21 |
|
import java.lang.reflect.Modifier; |
598 |
|
fail(reason); |
599 |
|
} catch (AssertionFailedError t) { |
600 |
|
threadRecordFailure(t); |
601 |
< |
fail(reason); |
601 |
> |
throw t; |
602 |
|
} |
603 |
|
} |
604 |
|
|
778 |
|
* necessarily individually slow because they must block. |
779 |
|
*/ |
780 |
|
void testInParallel(Action ... actions) { |
781 |
< |
ExecutorService pool = Executors.newCachedThreadPool(); |
782 |
< |
try { |
781 |
> |
try (PoolCloser<ExecutorService> poolCloser |
782 |
> |
= new PoolCloser<>(Executors.newCachedThreadPool())) { |
783 |
> |
ExecutorService pool = poolCloser.pool; |
784 |
|
ArrayList<Future<?>> futures = new ArrayList<>(actions.length); |
785 |
|
for (final Action action : actions) |
786 |
|
futures.add(pool.submit(new CheckedRunnable() { |
793 |
|
} catch (Exception ex) { |
794 |
|
threadUnexpectedException(ex); |
795 |
|
} |
794 |
– |
} finally { |
795 |
– |
joinPool(pool); |
796 |
|
} |
797 |
|
} |
798 |
|
|
799 |
|
/** |
800 |
|
* A debugging tool to print all stack traces, as jstack does. |
801 |
+ |
* Uninteresting threads are filtered out. |
802 |
|
*/ |
803 |
|
static void printAllStackTraces() { |
804 |
< |
for (ThreadInfo info : |
805 |
< |
ManagementFactory.getThreadMXBean() |
806 |
< |
.dumpAllThreads(true, true)) |
804 |
> |
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); |
805 |
> |
System.err.println("------ stacktrace dump start ------"); |
806 |
> |
for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) { |
807 |
> |
String name = info.getThreadName(); |
808 |
> |
if ("Signal Dispatcher".equals(name)) |
809 |
> |
continue; |
810 |
> |
if ("Reference Handler".equals(name) |
811 |
> |
&& info.getLockName().startsWith("java.lang.ref.Reference$Lock")) |
812 |
> |
continue; |
813 |
> |
if ("Finalizer".equals(name) |
814 |
> |
&& info.getLockName().startsWith("java.lang.ref.ReferenceQueue$Lock")) |
815 |
> |
continue; |
816 |
|
System.err.print(info); |
817 |
+ |
} |
818 |
+ |
System.err.println("------ stacktrace dump end ------"); |
819 |
|
} |
820 |
|
|
821 |
|
/** |