Warnung : Diese Programme sind Klonbomben (eine Art weniger gefährliche, aber immer noch gefährliche Form einer Gabelbombe). als solche, laufen sie nicht auf einem Produktivsystem ohne Sandbox oder Ressourcengrenzen . Klonbomben erzeugen Threads in einer Schleife (im Gegensatz zu Gabelbomben, die Prozesse in einer Schleife erzeugen). Sie können sie also einfach stoppen, indem Sie den betreffenden Prozess beenden (was sie viel weniger gefährlich macht als Gabelbomben, die sehr schwer zu handhaben sind klären); Aber sie werden wahrscheinlich den größten Teil Ihrer CPU belasten, bis Sie das schaffen (oder bis das Programm von selbst gewinnt und von selbst beendet wird). Wenn Sie Ihr Betriebssystem auffordern, die Größe des Arbeitsspeichers und die CPU-Zeit, die diese Programme verwenden dürfen, zu begrenzen, sollten Sie eine sichere Umgebung zum Testen dieser Programme schaffen.
Java (OpenJDK 8) , 65 bis 60 Byte (mit einer geringfügigen Änderung am Wrapper)
Thread x=Thread.currentThread();new Thread(x::stop).start();
Probieren Sie es online!
Erfordert, dass beide Instanzen von catch (Exception …)
in der Frage in geändert werden catch (Throwable …)
. Dies sollte in der Theorie mehr sicher, nicht weniger, aber es ermöglicht diese Lösung möglich zu sein.
Ich habe 5 Bytes gegenüber der ersten Version dieser Antwort gespart, indem ich eine Methodenreferenz anstelle eines Lambda verwendet habe.
Java 4, 104 Byte (ungetestet, sollte mit dem Original-Wrapper funktionieren)
final Thread x=Thread.currentThread();new Thread(){public void run(){x.stop(new Exception());}}.start();
Probieren Sie es online! (Link geht zu einer Java 8-Implementierung, funktioniert also nicht)
Mithilfe von Funktionen, die aus modernen Java-Versionen entfernt wurden, kann sogar die Version des Puzzles gelöst werden, für die eine erforderlich ist Exception
. Zumindest wahrscheinlich. (Java 4 ist mittlerweile sehr alt und ich kann mich nicht erinnern, welche Funktionen es enthielt und welche nicht. Wie man sieht, gab es damals in Java viel weniger Funktionen und diese waren daher ausführlicher; wir hatten keine Lambdas, also musste ich eine innere Klasse schaffen.)
Erklärungen
Die meisten Lösungen für diese Frage sind in C # (zusammen mit einer Java-Lösung, die über die Verwendung von unsymmetrischen Klammern als Form der Code-Injection täuscht, und einer Perl-Lösung, die ebenfalls nicht in Java enthalten ist). Daher hielt ich es für sinnvoll, zu zeigen, wie dieses Rätsel auch in Java "richtig" gelöst werden kann.
Beide Programme sind praktisch identisch (die Tatsache, dass das erste Programm funktioniert, gibt mir die Gewissheit, dass das zweite Programm auch funktioniert, es sei denn, ich habe versehentlich eine Nicht-Java-4-Funktion verwendet, Thread#stop
die in Java 5 veraltet war).
Javas Thread#stop
Methode funktioniert hinter den Kulissen, indem ein Wurfobjekt in den fraglichen Thread geworfen wird. Das für diesen Zweck vorgesehene Wurfobjekt ist ThreadDeath
( Error
insbesondere, weil die Leute oft versuchen, Ausnahmen zu überdecken und Javas Designer dies nicht wollten), obwohl Sie damit irgendwann nach der API alles werfen können (oder es gewohnt waren) Javas Designer erkannten, dass dies eine unglaublich schlechte Idee war, und entfernten die Version der Methode, die Argumente direkt in die Hand nimmt. Natürlich ist selbst die Version, die wirft, ThreadDeath
eine ziemlich riskante Operation, für die Sie nur wenige Garantien abgeben können (zum Beispiel können Sie damit dieses Rätsel lösen, was "nicht" möglich sein sollte, also sollten Sie es nicht tun benutze es, aber ab Java 8 funktioniert es immer noch.
Dieses Programm erzeugt einen neuen Thread und fordert ihn auf, eine Ausnahme zwangsweise in den Haupt-Thread zurück zu werfen. Wenn wir Glück haben, geschieht dies zu einem Zeitpunkt, an dem wir außerhalb des inneren catch
Blocks sind (wir können den äußeren catch
Block nicht verlassen, bis das Programm endet, da es eine Schleife gibt). Da wir die Schleife bereits hinzugefügt haben, ist es Byte-sparend, diese Schleife einfach zu verwenden, damit wir weiterhin Threads erstellen können, in der Hoffnung, dass einer von ihnen irgendwann das richtige Timing erreicht. Dies scheint normalerweise innerhalb weniger Sekunden zu geschehen.
(Hinweis zu TIO: Die aktuelle Version von TIO ist sehr geneigt, dieses Programm zu einem frühen Zeitpunkt seiner Ausführung abzubrechen, vermutlich weil alle Threads erstellt wurden. Es kann mit TIO funktionieren, funktioniert jedoch nicht zuverlässig, weshalb häufig einige Versuche erforderlich sind Holen Sie sich die Ausgabe "Sie haben gewonnen!".)