7 |
|
package java.util.concurrent; |
8 |
|
|
9 |
|
import java.security.AccessControlContext; |
10 |
+ |
import java.security.AccessController; |
11 |
+ |
import java.security.PrivilegedAction; |
12 |
|
import java.security.ProtectionDomain; |
13 |
|
|
14 |
|
/** |
61 |
|
} |
62 |
|
|
63 |
|
/** |
64 |
+ |
* Version for use by the default pool. Supports setting the |
65 |
+ |
* context class loader. This is a separate constructor to avoid |
66 |
+ |
* affecting the protected constructor. |
67 |
+ |
*/ |
68 |
+ |
ForkJoinWorkerThread(ForkJoinPool pool, ClassLoader ccl) { |
69 |
+ |
super("aForkJoinWorkerThread"); |
70 |
+ |
super.setContextClassLoader(ccl); |
71 |
+ |
this.pool = pool; |
72 |
+ |
this.workQueue = pool.registerWorker(this); |
73 |
+ |
} |
74 |
+ |
|
75 |
+ |
/** |
76 |
|
* Version for InnocuousForkJoinWorkerThread. |
77 |
|
*/ |
78 |
< |
ForkJoinWorkerThread(ForkJoinPool pool, ThreadGroup threadGroup, |
78 |
> |
ForkJoinWorkerThread(ForkJoinPool pool, |
79 |
> |
ClassLoader ccl, |
80 |
> |
ThreadGroup threadGroup, |
81 |
|
AccessControlContext acc) { |
82 |
|
super(threadGroup, null, "aForkJoinWorkerThread"); |
83 |
+ |
super.setContextClassLoader(ccl); |
84 |
|
ThreadLocalRandom.setInheritedAccessControlContext(this, acc); |
85 |
|
ThreadLocalRandom.eraseThreadLocals(this); // clear before registering |
86 |
|
this.pool = pool; |
167 |
|
|
168 |
|
/** |
169 |
|
* A worker thread that has no permissions, is not a member of any |
170 |
< |
* user-defined ThreadGroup, and erases all ThreadLocals after |
170 |
> |
* user-defined ThreadGroup, uses the system class loader as |
171 |
> |
* thread context class loader, and erases all ThreadLocals after |
172 |
|
* running each top-level task. |
173 |
|
*/ |
174 |
|
static final class InnocuousForkJoinWorkerThread extends ForkJoinWorkerThread { |
175 |
|
/** The ThreadGroup for all InnocuousForkJoinWorkerThreads */ |
176 |
|
private static final ThreadGroup innocuousThreadGroup = |
177 |
< |
java.security.AccessController.doPrivileged( |
178 |
< |
new java.security.PrivilegedAction<>() { |
179 |
< |
public ThreadGroup run() { |
180 |
< |
ThreadGroup group = Thread.currentThread().getThreadGroup(); |
181 |
< |
for (ThreadGroup p; (p = group.getParent()) != null; ) |
182 |
< |
group = p; |
183 |
< |
return new ThreadGroup(group, "InnocuousForkJoinWorkerThreadGroup"); |
184 |
< |
}}); |
177 |
> |
java.security.AccessController.doPrivileged( |
178 |
> |
new java.security.PrivilegedAction<>() { |
179 |
> |
public ThreadGroup run() { |
180 |
> |
ThreadGroup group = Thread.currentThread().getThreadGroup(); |
181 |
> |
for (ThreadGroup p; (p = group.getParent()) != null; ) |
182 |
> |
group = p; |
183 |
> |
return new ThreadGroup(group, "InnocuousForkJoinWorkerThreadGroup"); |
184 |
> |
}}); |
185 |
|
|
186 |
|
/** An AccessControlContext supporting no privileges */ |
187 |
|
private static final AccessControlContext INNOCUOUS_ACC = |
191 |
|
}); |
192 |
|
|
193 |
|
InnocuousForkJoinWorkerThread(ForkJoinPool pool) { |
194 |
< |
super(pool, innocuousThreadGroup, INNOCUOUS_ACC); |
194 |
> |
super(pool, |
195 |
> |
ClassLoader.getSystemClassLoader(), |
196 |
> |
innocuousThreadGroup, |
197 |
> |
INNOCUOUS_ACC); |
198 |
|
} |
199 |
|
|
200 |
|
@Override // to erase ThreadLocals |
202 |
|
ThreadLocalRandom.eraseThreadLocals(this); |
203 |
|
} |
204 |
|
|
184 |
– |
@Override // to always report system loader |
185 |
– |
public ClassLoader getContextClassLoader() { |
186 |
– |
return ClassLoader.getSystemClassLoader(); |
187 |
– |
} |
188 |
– |
|
205 |
|
@Override // to silently fail |
206 |
|
public void setUncaughtExceptionHandler(UncaughtExceptionHandler x) { } |
207 |
|
|