Мы проводим соревнование по программированию AI
, в котором участники будут кодировать AI
, который работает на JVM
, используя наш API
, который мы им предоставляем.Мы помещаем их в песочницу, ограничивая то, что они могут делать с SecurityManager
, и во время выполнения они просто устанавливают несколько флагов, которые являются их решениями.Единственное взаимодействие между нашей системой и их AI
происходит через эти флаги, поэтому, если их поток внезапно умрет, у нас не будет плохих последствий.
Когда AI
вычисляет слишком долго, мы быхотел бы закрыть свою нить.Тем не менее, мы не можем найти способ гарантировать, что мы уничтожим их поток.Одной из возможных причин этого является то, что AI
входит в бесконечный цикл без блокировки, что делает Thread.interrupt()
бесполезным.Thread.stop()
ненадежен, поскольку, если они находятся в блоке try catch, исключение ThreadDeath
будет перехвачено, и у нас нет проблем, потому что они ничего плохого не касаются, и нам все равно, умрут ли они.
В настоящее время мы просто игнорируем их поток и продолжаем без них после истечения времени ожидания, но их бесконечный цикл будет продолжать обработку в фоновом режиме до тех пор, пока JVM
не умрет.Это неприемлемо для нас, потому что мы будем запускать матчи в фоновом режиме на веб-сервере 24/7, поэтому мы хотим максимально возможной стабильности.Одна мысль состояла в том, чтобы запустить каждую игру в отдельном JVM
, но это намного сложнее, чем мы хотели бы получить.
Есть ли какой-нибудь верный способ уничтожить нить?