在课程interrupt()的Thread方法中,我们调用checkAccess,然后调用SecurityManager#checkAccess(Thread)。现在,考虑SecurityManager.checkAccess(Thread)
方法的来源:
public void checkAccess(Thread t) {
if (t == null) {
throw new NullPointerException("thread can't be null");
}
if (t.getThreadGroup() == rootGroup) { //1
checkPermission(SecurityConstants.MODIFY_THREAD_PERMISSION);
} else {
// just return
}
}
在//1
我们进行比较,如果线程属于根组,如果不属于,我们不应用SecurityManager
实例提供的访问规则。所以,我写了以下示例:
public static void main (String[] args) throws java.lang.Exception
{
Thread t = new Thread();
System.out.println(t.getThreadGroup()); //prints java.lang.ThreadGroup[name=main,maxpri=10]
System.out.println(t.getThreadGroup().getParent()); //prints java.lang.ThreadGroup[name=system,maxpri=10]
}
并发现使用Thread
的构造函数创建的线程不属于rootGroup
。因此,java.policy
文件中指定的权限(特别是)将永远不会应用于我们自己创建的线程。
有什么理由吗?我的意思是,将权限应用于唯一的根组?
答案 0 :(得分:2)
我想,我认为一个线程被允许中断通常是安全的(不是安全问题),等等不是系统线程的线程。
请注意,javadoc说:
"如果thread参数是系统线程(属于具有null父级的线程组),则此方法使用RuntimePermission(" modifyThread")权限调用checkPermission。如果thread参数不是系统线程,则此方法只是静默返回。"
"需要更严格策略的应用程序应覆盖此方法。 ....."