如何让线程只修改自己

时间:2015-09-27 04:57:32

标签: java multithreading

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{ ... }部分。有没有办法拒绝这样的线程通信?

1 个答案:

答案 0 :(得分:1)

为了让您使用policy files来控制可以致电Thread.interrupt()的人,需要有policy来管理此访问权限。正如您所见,SecurityManager.checkPermission()中没有Thread.interrupt()来电,所以这显然是不可能的。这是设计原因,因为策略旨在限制代码源的访问,而不是线程(可以从多个源位置执行代码)。如果未授权代码源访问某个策略,则永远不会运行受该策略保护的代码。

相反,Thread访问受SecurityManager.checkAccess(Thread)方法的约束。来自Thread.checkAccess()

  

确定当前运行的线程是否有权修改此线程。

     

如果有安全管理器,则以此线程作为参数调用其checkAccess方法。

SecurityManager.checkAccess(Thread)确切地描述了如何限制访问:

  

如果不允许调用线程修改线程参数,则抛出SecurityException

     

stopsuspendresumesetPrioritysetNamesetDaemon为当前安全管理员调用此方法Thread类的方法。 [原文如此。这应包括interrupt以及]

     

....如果thread参数不是系统线程,则此方法只是静默返回。

     

想要更严格的政策的应用程序应该覆盖此方法....

所以你去吧。定义一个自定义SecurityManager,在checkAccess(Thread)中引发异常以限制谁可以中断或修改线程..

关于授予权限与拒绝权限的第二个问题,Policy File Syntax页面详细说明只有grant语句,there is no deny mechanism