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

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

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

Знаю, что можно передать в параметрах вызова функции, но рассмотрим случай "злоупотребления" и необходимости принудительного ограничения.
  • Вопрос задан
  • 660 просмотров
Решения вопроса 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, которая сама по себе жрёт лишние ресурсы.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
ОТП Банк Москва
от 240 000 до 270 000 ₽
Sportmaster Lab Санкт-Петербург
от 150 000 ₽
Эвотор Москва
от 180 000 до 250 000 ₽