在interrupt()方法的文档中,我们有:
Throws:
SecurityException - if the current thread cannot modify this thread
方法的source code是:
public void interrupt() {
if (this != Thread.currentThread())
checkAccess(); //checking access
//The rest is ommited
}
checkAccess
方法依次实现如下:
public final void checkAccess() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkAccess(this);
}
}
默认情况下,据我所知,任何线程都允许修改其他任何线程。
但是有没有办法在modifyThread
文件中指定java.policy
权限以允许线程只修改自己?
在java.policy
我可以找到唯一的grant{ ... }
部分。有没有办法拒绝这样的线程通信?
答案 0 :(得分:1)
为了让您使用policy files来控制可以致电Thread.interrupt()
的人,需要有policy来管理此访问权限。正如您所见,SecurityManager.checkPermission()
中没有Thread.interrupt()
来电,所以这显然是不可能的。这是设计原因,因为策略旨在限制代码源的访问,而不是线程(可以从多个源位置执行代码)。如果未授权代码源访问某个策略,则永远不会运行受该策略保护的代码。
相反,Thread
访问受SecurityManager.checkAccess(Thread)
方法的约束。来自Thread.checkAccess()
:
确定当前运行的线程是否有权修改此线程。
如果有安全管理器,则以此线程作为参数调用其
checkAccess
方法。
SecurityManager.checkAccess(Thread)
确切地描述了如何限制访问:
如果不允许调用线程修改线程参数,则抛出
SecurityException
。
stop
,suspend
,resume
,setPriority
,setName
和setDaemon
为当前安全管理员调用此方法Thread类的方法。 [原文如此。这应包括interrupt
以及]....如果thread参数不是系统线程,则此方法只是静默返回。
想要更严格的政策的应用程序应该覆盖此方法....
所以你去吧。定义一个自定义SecurityManager
,在checkAccess(Thread)
中引发异常以限制谁可以中断或修改线程..
关于授予权限与拒绝权限的第二个问题,Policy File Syntax页面详细说明只有grant
语句,there is no deny
mechanism。