testDescendantThreadGroups() — netty Function Reference
Architecture documentation for the testDescendantThreadGroups() function in DefaultThreadFactoryTest.java from the netty codebase.
Entity Profile
Dependency Diagram
graph TD d1d3ae34_c090_80b3_5d37_0b48f111ccc9["testDescendantThreadGroups()"] eaa6bd91_82d8_cddc_06fc_0aeeb341228a["DefaultThreadFactoryTest"] d1d3ae34_c090_80b3_5d37_0b48f111ccc9 -->|defined in| eaa6bd91_82d8_cddc_06fc_0aeeb341228a style d1d3ae34_c090_80b3_5d37_0b48f111ccc9 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
common/src/test/java/io/netty/util/concurrent/DefaultThreadFactoryTest.java lines 34–127
@Test
@Timeout(value = 2000, unit = TimeUnit.MILLISECONDS)
public void testDescendantThreadGroups() throws InterruptedException {
final SecurityManager current = System.getSecurityManager();
boolean securityManagerSet = false;
try {
try {
// install security manager that only allows parent thread groups to mess with descendant thread groups
System.setSecurityManager(new SecurityManager() {
@Override
public void checkAccess(ThreadGroup g) {
final ThreadGroup source = Thread.currentThread().getThreadGroup();
if (source != null) {
if (!source.parentOf(g)) {
throw new SecurityException("source group is not an ancestor of the target group");
}
super.checkAccess(g);
}
}
// so we can restore the security manager at the end of the test
@Override
public void checkPermission(Permission perm) {
}
});
} catch (UnsupportedOperationException e) {
Assumptions.assumeFalse(true, "Setting SecurityManager not supported");
}
securityManagerSet = true;
// holder for the thread factory, plays the role of a global singleton
final AtomicReference<DefaultThreadFactory> factory = new AtomicReference<DefaultThreadFactory>();
final AtomicInteger counter = new AtomicInteger();
final Runnable task = new Runnable() {
@Override
public void run() {
counter.incrementAndGet();
}
};
final AtomicReference<Throwable> interrupted = new AtomicReference<Throwable>();
// create the thread factory, since we are running the thread group brother, the thread
// factory will now forever be tied to that group
// we then create a thread from the factory to run a "task" for us
final Thread first = new Thread(new ThreadGroup("brother"), new Runnable() {
@Override
public void run() {
factory.set(new DefaultThreadFactory("test", false, Thread.NORM_PRIORITY, null));
final Thread t = factory.get().newThread(task);
t.start();
try {
t.join();
} catch (InterruptedException e) {
interrupted.set(e);
Thread.currentThread().interrupt();
}
}
});
first.start();
first.join();
assertNull(interrupted.get());
// now we will use factory again, this time from a sibling thread group sister
// if DefaultThreadFactory is "sticky" about thread groups, a security manager
// that forbids sibling thread groups from messing with each other will strike this down
final Thread second = new Thread(new ThreadGroup("sister"), new Runnable() {
@Override
public void run() {
final Thread t = factory.get().newThread(task);
t.start();
try {
t.join();
} catch (InterruptedException e) {
interrupted.set(e);
Thread.currentThread().interrupt();
}
}
Domain
Subdomains
Source
Frequently Asked Questions
What does testDescendantThreadGroups() do?
testDescendantThreadGroups() is a function in the netty codebase, defined in common/src/test/java/io/netty/util/concurrent/DefaultThreadFactoryTest.java.
Where is testDescendantThreadGroups() defined?
testDescendantThreadGroups() is defined in common/src/test/java/io/netty/util/concurrent/DefaultThreadFactoryTest.java at line 34.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free