У меня есть программа, в которой я компилирую код Java, который пользователь вводит в текстовое поле, а затем запускаю его. Выполнение кода в отдельном потоке, чтобы графический интерфейс, который они используют для ввода исходного кода, не блокировался.
В графическом интерфейсе есть кнопка прерывания, которая должна остановить поток. Моя проблема в том, что мне нужно остановить поток компиляции, независимо от того, что происходит внутри него, что означает, что я должен учитывать случай, когда поток пойман в бесконечный цикл (из-за ошибки пользователя), и он не может правильно завершиться сам с помощью безопасного флага. Я читал о многих решениях, которые включают использование какого-либо флага, но они не доступны для меня из-за этой проблемы зацикливания. Мне нужно остановить поток и освободить память, которую он использует (я не могу просто оставить ее на заднем плане, если только это не единственное оставшееся решение). Любой совет или альтернативные решения? Надеемся, что некоторые свежие перспективы помогут решить эту проблему.
Edit:
Вот пример кода, представленного пользователем:
public class RunMe extends SomethingThatRuns {
public void run() {
int i = 0;
while (i = 0) {
//Prepare to get stuck!
}
}
}
Я скомпилирую этот класс, а затем запустите его. Вот где он застрянет, и метод run()
никогда не сможет завершиться или даже выполнить цикл для проверки флага.