java執行緒池之PrivilegedThreadFactory
這個類的原始碼如下:
static class PrivilegedThreadFactory extends DefaultThreadFactory {
private final AccessControlContext acc;
private final ClassLoader ccl;
PrivilegedThreadFactory() {
super();
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
// Calls to getContextClassLoader from this class
// never trigger a security check, but we check
// whether our callers have this permission anyways.
sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
// Fail fast
sm.checkPermission(new RuntimePermission("setContextClassLoader"));
}
this.acc = AccessController.getContext();
this.ccl = Thread.currentThread().getContextClassLoader();
}
public Thread newThread(final Runnable r) {
return super.newThread(new Runnable() {
public void run() {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
Thread.currentThread().setContextClassLoader(ccl);
r.run();
return null;
}
}, acc);
}
});
}
}
返回用於建立新執行緒的執行緒工廠,這些新執行緒與當前執行緒具有相同的許可權。此工廠建立具有與 defaultThreadFactory()
相同設定的執行緒,新執行緒的 AccessControlContext 和 contextClassLoader 的其他設定與呼叫此 privilegedThreadFactory 方法的執行緒相同。可以在 AccessController.doPrivileged(java.security.PrivilegedAction )
操作中建立一個新 privilegedThreadFactory,設定當前執行緒的訪問控制上下文,以便建立具有該操作中保持的所選許可權的執行緒。
注意,雖然執行在此類執行緒中的任務具有與當前執行緒相同的訪問控制和類載入器,但是它們無需具有相同的 ThreadLocal
或 InheritableThreadLocal
值。如有必要,使用 ThreadPoolExecutor.beforeExecute(java.lang.Thread, java.lang.Runnable)
在 ThreadPoolExecutor
子類中執行任何任務前,可以設定或重置執行緒區域性變數的特定值。另外,如果必須初始化 worker 執行緒,以具有與某些其他指定執行緒相同的 InheritableThreadLocal 設定,則可以線上程等待和服務建立請求的環境中建立自定義的 ThreadFactory,而不是繼承其值。