Что может сделать нить непрерывной и не завершающейся?JAVA

Программисты JAVA общаются здесь
Anonymous
Что может сделать нить непрерывной и не завершающейся?

Сообщение Anonymous »

tl; dr - мне нужен полный список механизмов/шаблонов, которые могут привести к коду Java, который работает навсегда и не может быть прерван
Существует множество вещей, которые могут сделать джаву. прерывим - то есть призывник может заставить их умереть и выпустить любые ресурсы, которые они имели. Другие непрестрагимый , и нет (простой, безопасный) механизм не может привести к их смерти - они будут продолжать работать до тех пор, пока сама JVM не будет отключен. Тесты в приведенном ниже примере демонстрируют это: прерываемое сонное выведет в консоль только до тех пор, пока не будет достигнут тайм -аут, в то время как непрерывная спинни будет продолжать выводиться до тех пор, пока тестовый завершается, а JVM не отключается. Thread.sleep (or other interrupt-checking) calls
[*]Any non-terminating code which catches and swallows InterruptedExceptions
[*]Any non-terminating code which checks (and clears) the Thread.interrupted() status without throwing an exception

My question is, what else может привести к этому? (Возможные примеры - тупики с различными механизмами блокировки, ожидание ввода -вывода, бесконечная рекурсия с рекурсирующими для хвостами оптимизации, которые избегают переполнения стека). Я ищу как можно более полное список. сильно документируйте конкретные механизмы, которых следует избегать. < /p>
import org.junit.jupiter.api.Test;
import java.util.concurrent.*;

public class TimeoutTest {

private static boolean sneakyTrue() { return true;}
private static String sleepy() throws InterruptedException{
while (sneakyTrue()) {
Thread.sleep(1 * 1000);
System.out.println("Sleepy is still running");
}
return "Unreachable";
}
private static String spinny(){
var x = 0;
while (sneakyTrue()) {
x++;
if (x == 0) System.out.println("Spinny is still running");
}
return "Unreachable";

}

private static String maybeTimeout(Callable f){
ExecutorService exec = Executors.newSingleThreadExecutor();
var result = exec.submit(f);
try{
return result.get(5, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
catch (TimeoutException e){
result.cancel(true);
System.out.println("Thread has timed out");
return "Timed out";
}
}

@Test
void spinnyShouldBeAbleToTimeout() {
assert (maybeTimeout(TimeoutTest::spinny).equals("Timed out"));
try {
Thread.sleep(15 * 1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}

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


Подробнее здесь: https://stackoverflow.com/questions/795 ... erminating

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