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; |
744 |
|
} |
745 |
|
|
746 |
|
/** |
747 |
+ |
* Allows use of try-with-resources with per-test thread pools. |
748 |
+ |
*/ |
749 |
+ |
static class PoolCloser<T extends ExecutorService> |
750 |
+ |
implements AutoCloseable { |
751 |
+ |
public final T pool; |
752 |
+ |
public PoolCloser(T pool) { this.pool = pool; } |
753 |
+ |
public void close() { joinPool(pool); } |
754 |
+ |
} |
755 |
+ |
|
756 |
+ |
/** |
757 |
|
* Waits out termination of a thread pool or fails doing so. |
758 |
|
*/ |
759 |
< |
void joinPool(ExecutorService pool) { |
759 |
> |
static void joinPool(ExecutorService pool) { |
760 |
|
try { |
761 |
|
pool.shutdown(); |
762 |
|
if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS)) |
799 |
|
|
800 |
|
/** |
801 |
|
* A debugging tool to print all stack traces, as jstack does. |
802 |
+ |
* Uninteresting threads are filtered out. |
803 |
|
*/ |
804 |
|
static void printAllStackTraces() { |
805 |
< |
for (ThreadInfo info : |
806 |
< |
ManagementFactory.getThreadMXBean() |
807 |
< |
.dumpAllThreads(true, true)) |
805 |
> |
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); |
806 |
> |
System.err.println("------ stacktrace dump start ------"); |
807 |
> |
for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) { |
808 |
> |
String name = info.getThreadName(); |
809 |
> |
if ("Signal Dispatcher".equals(name)) |
810 |
> |
continue; |
811 |
> |
if ("Reference Handler".equals(name) |
812 |
> |
&& info.getLockName().startsWith("java.lang.ref.Reference$Lock")) |
813 |
> |
continue; |
814 |
> |
if ("Finalizer".equals(name) |
815 |
> |
&& info.getLockName().startsWith("java.lang.ref.ReferenceQueue$Lock")) |
816 |
> |
continue; |
817 |
|
System.err.print(info); |
818 |
+ |
} |
819 |
+ |
System.err.println("------ stacktrace dump end ------"); |
820 |
|
} |
821 |
|
|
822 |
|
/** |