Wir führen ein AI
Programmierwettbewerb, bei dem die Teilnehmer ein AI
die auf dem JVM
über unser API
wir bieten sie an. Wir stecken sie in einen Sandkasten, indem wir ihre Möglichkeiten mit einer SecurityManager
und während der Laufzeit setzen sie einfach mehrere Flaggen, die ihre Entscheidungen darstellen. Die einzige Interaktion zwischen unserem System und ihren AI
ist durch diese Flaggen, so dass es keine negativen Auswirkungen auf uns hat, wenn ihr Thread plötzlich stirbt.
Wenn ein AI
viel zu lange rechnet, möchten wir ihren Thread schließen. Wir können jedoch nicht garantieren, dass wir ihren Thread zerstören werden. Ein möglicher Grund dafür ist, dass die AI
geht in eine Endlosschleife ohne Blockierung über, wodurch Thread.interrupt()
unbrauchbar. Thread.stop()
ist unzuverlässig, denn wenn sie sich in einem Try-Catch-Block befinden, wird die ThreadDeath
Ausnahme gefangen werden, und hat keine Probleme für uns, weil sie nichts Böses anfassen und es uns egal ist, wenn sie sterben.
Derzeit ignorieren wir ihren Thread und machen ohne sie weiter, nachdem sie die Zeit überschritten haben, aber ihre Endlosschleife wird im Hintergrund weiterlaufen, bis die JVM
stirbt. Dies ist für uns inakzeptabel, da wir die Spiele im Hintergrund auf einem Webserver rund um die Uhr laufen lassen werden, so dass wir so viel Stabilität wie möglich wollen. Ein Gedanke war, jedes Spiel in einem separaten JVM
aber das ist viel komplexer, als wir es uns vorstellen können.
Gibt es eine sichere Methode, um das Gewinde zu zerstören?