По умолчанию ForkJoinPool
используются потоки, которые не имеют привилегий.
Одним из решений является создание нового экземпляра ForkJoinPool
с фабрикой пользовательских потоков или любой другой реализации Executor
с использованием обычных потоков. , Уловка в том, что создание собственного пула потоков требует предоставления соответствующих разрешений администратором безопасности.
Альтернативой является выполнение запроса в качестве привилегированного действия, игнорирующее ограничения вызывающего потока:
public class CustomSupplier implements Supplier<String> {
public CustomSupplier() {
}
public String get() {
//Time consuming complex Task and finally return "os.arch"
//...
//...
//...
return AccessController.doPrivileged(
(PrivilegedAction<String>)() -> System.getProperty("os.arch"));
}
}
Это игнорирует привилегии вызывающей стороны и выполняет запрос с разрешением кода, вызывающего doPrivileged
, т.е. ваш CustomSupplier
. По умолчанию коду приложения предоставляется право на чтение системного свойства "os.arch"
.
Но поскольку ожидается, что это системное свойство никогда не изменится в течение срока службы приложения, и его запрос не является дорогостоящей операцией, поэтому существует нет необходимости выполнять запрос в фоновом режиме.
public class CustomSupplier implements Supplier<String> {
public CustomSupplier() {
}
public String get() {
//Time consuming complex Task and finally return "os.arch"
//...
//...
//...
return ARCH;
}
static final String ARCH = System.getProperty("os.arch");
}