Строго применение тайм -аутов на JVM для произвольного кода?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Строго применение тайм -аутов на JVM для произвольного кода?

Сообщение Anonymous »

У меня есть ситуация, когда многопоточная служба делает параллельные вызовы с использованием пользователя, по которому у меня нет управления. Я надеюсь найти механизм, с помощью которого эти вызовы могут быть рассчитаны на время, если они вступят в тупик/бесконечный цикл/другие невозвратные состояния, независимо от того, как называется код. Для тайм-аута мне нужно: < /p>

Чтобы вернуться, продолжить невозвращающий вызов в течение ограниченного времени и < /li>
Убить невозвращающую нить и приносить любые ресурсы, которые он придерживался < /li>
< /ol>
До сих пор. Второе: < /p>

Код: Выделить всё

public static String maybeTimeout(Callable task, long timeOutMs) {
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
Future taskFuture = executor.submit(task);

try {
return taskFuture.get(timeOutMs, TimeUnit.MILLISECONDS);
} catch (Exception e) {
taskFuture.cancel(true);
System.out.println("Timed out!");
return "Timed out";
}
}
}
Это работает для кода, который дает, (здесь с thread.sleep call)

Код: Выделить всё

public static Boolean sneakyTrue() {
return true;
}

public static String sleepy() {
return maybeTimeout(
() -> {
var x = 0;
while (sneakyTrue()) {
x = x + 1;
System.out.println("Sleeping again: " + x);
Thread.sleep(1000);
}
return "Unreachable";
},
5000);
}
< /code>
Но не с кодом, который не: < /p>
public static String spinny() {
return maybeTimeout(
() -> {
var x = 0;
var y = 0;
while (sneakyTrue()) {
x = x + 1;
if (x == 0) {
System.out.println("Spinning another maxInt times:" + y);
y = y + 1;
}
}
return "Unreachable";
},
5000);
}
< /code>
Тесты, которые у меня есть, подтверждают это поведение: < /p>
import org.junit.jupiter.api.Test;
import java.util.concurrent.*;

...

@Test
void sleepyShouldBeAbleToTimeout() {
assert (sleepy().equals("Timed out"));
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}

@Test
void spinnyShouldBeAbleToTimeout() {
assert (spinny().equals("Timed out"));
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
Если вы запускаете приведенные выше тесты, оба «пройти», но обратите внимание, что во время 10-секундного сна, Spinny продолжает работать/печать в консоли, в то время как сонный быстро убит. Я обеспокоен тем, что это может привести к голоду потока/ресурса, если многие потоки застряли в несуществующем коде пользователя. Есть ли какой -нибудь механизм, который может более строго прекратить потоки?

Подробнее здесь: https://stackoverflow.com/questions/795 ... trary-code
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»