В способекласса Thread у нас есть checkAccess, который в свою очередь вызывает SecurityManager#checkAccess(Thread). Теперь рассмотрим источники метода SecurityManager.checkAccess(Thread)
:Почему правила доступа не применяются к группе без полномочий root?
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
«s конструкторов не принадлежат к rootGroup
. Таким образом, разрешения, указанные в файле java.policy
(в частности), никогда не будут применяться нитями, которые мы создаем сами.
Есть ли причина для этого? Я имею в виду, чтобы применить разрешения к единственной корневой группе?
Что бы обоснование блокировки потоков взаимодействия («изменить») между нитями приложения? Потоковое Java-приложение не является ареной «основных войн», где программисты соперничают за наиболее надежную нить. - Что находится внизу этого и еще одного подобного вопроса? – laune
@laune Не знаю, очевидно. Но я использую 'interrupt()' в моем приложении, которое выдает «SecurityException». Поэтому мне нужно знать, как и при каких обстоятельствах это происходит. –
Интересно. Какую тему вы нажимаете? – laune