Как ограничить функцию (по времени и памяти)?

Добрый день!
Если это возможно вообще (например, для вычисления минимумов функций разными методами)...
public class C1
{
...
    public void f1(ArrayList<Integer> al1)
    {...

1. Возможно ли вызвать f1 таким образом, чтобы принудительно прервать ее вызов через 10 секунд, при этом она вернула посчитанные к тому моменту значения в al1?
2. Ограничить потребляемые ресурсы памяти при вызове f1

Знаю, что можно передать в параметрах вызова функции, но рассмотрим случай "злоупотребления" и необходимости принудительного ограничения.
  • Вопрос задан
  • 677 просмотров
Решения вопроса 1
EugeneP2
@EugeneP2
Java Dev
Могу подсказать насчет первого пункта.

Запустить функцию отдельным потоком и при выполнение каждой операции проверять
Thread t = new Thread.... {

if (Thread.interrupted()) {
// сохранить текущий результат и выйти из метода
}
});;

t.start();

t.join(10000); // ждем поток 10 сек

t.interrupt(); // предлагаем потоку прервать выполнение
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@cthulhudx
1) Как сказал Sirikid - "лучше переписать функцию так, что бы она возвращала отсортированный список"
class SomeClass {
public List<Integer> calculate() {
List<Integer> results = new ArrayList<>();
//Выполняем вычисления, заполняем коллекцию
return Collections.sort(results);
} 
...

2)Ограничить потребляемую виртуальной машиной память можно с помощью ключей Xms и Xmx (работает не на всех jvm-ах).Ограничить же ресурсы потребляемые одним методом не представляется возможным.
Ответ написан
Deerenaros
@Deerenaros
Программист, математик, задрот и даже чуть инженер
1) Можно навелосипедить на потоках, аля Eugene, можно использовать готовое аля Sirikid.
2) Делаем свой менеджер ресурсов, который ограничивает число созданных массивов. Из минусов - придётся использовать этот менеджер, что ни разу не удобно (разбухает код), да и без натива довольно сложно будет контролировать память. Но теоретически - возможно.
3) Зачем это нужно - остаётся открытым. Если не уверены, что задача будет выполнена вовремя, значит вы плохой программист. Если уверены, что задача не будет выполнена вовремя, значит требуется искать другое решение. В том числе потенциальный отказ от Java, которая сама по себе жрёт лишние ресурсы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы