경고 :이 프로그램은 클론 폭탄 (위험하지는 않지만 여전히 위험한 형태의 포크 폭탄)입니다. 따라서 샌드 박싱이나 리소스 제한없이 프로덕션 시스템에서 실행하지 마십시오 . 복제 폭탄은 루프에서 프로세스를 생성하는 포크 폭탄과 달리 루프에서 스레드를 생성하므로 문제가있는 프로세스를 죽여서 간단히 중지 할 수 있습니다 (포크 폭탄보다 훨씬 덜 위험하게 만들 수 있음). 정리); 그러나 그렇게 할 때까지 (또는 프로그램이 자연스럽게 이기고 자연스럽게 나올 때까지) 대부분의 CPU를 묶을 것입니다. OS에 이러한 프로그램의 사용이 허용 된 메모리 및 CPU 시간에 제한을 두도록 요청하면 테스트 할 안전한 환경이 만들어집니다.
Thread x=Thread.currentThread();new Thread(x::stop).start();
온라인으로 사용해보십시오!
catch (Exception …)
질문 의 두 인스턴스를 모두 로 변경해야 catch (Throwable …)
합니다. 이론 상으로는 더 안전 해야 하지만이 솔루션을 사용할 수 있습니다.
람다가 아닌 메소드 참조를 사용 하여이 답변의 첫 번째 버전에 5 바이트를 저장했습니다.
Java 4, 104 바이트 (추천되지 않은 원본 래퍼와 함께 작동해야 함)
final Thread x=Thread.currentThread();new Thread(){public void run(){x.stop(new Exception());}}.start();
온라인으로 사용해보십시오! (링크는 Java 8 구현으로 이동하므로 작동하지 않습니다)
최신 버전의 Java에서 제거 된 기능을 사용하여을 필요로하는 퍼즐 버전까지도 해결할 수 Exception
있습니다. 아마 적어도. (Java 4는 지금까지는 매우 오래되었으며 기능과 포함하지 않은 기능을 기억할 수 없습니다. 보시다시피 Java에는 기능이 훨씬 적었고 더 장황했습니다. 람다, 그래서 내부 클래스를 만들어야했습니다.)
설명
이 질문에 대한 대부분의 솔루션은 C #에 있습니다 (불균형 괄호를 코드 주입의 형태로 사용하여 속이는 Java 솔루션과 Java가 아닌 Perl 솔루션과 함께). 그래서 저는이 퍼즐이 어떻게 자바에서 "적절하게"해결 될 수 있는지 보여줄 가치가 있다고 생각했습니다.
두 프로그램 모두 효과적으로 동일합니다 (따라서 첫 번째 프로그램이 작동한다는 사실은 실수로 Java-4가 아닌 기능을 사용하지 않으면 Thread#stop
Java 5에서 더 이상 사용되지 않는 한 두 번째 프로그램도 작동한다는 확신을줍니다 .)
Java의 Thread#stop
메소드는 문제의 스레드에 Throwable을 던져서 뒤에서 작동합니다. throw 가능 객체는 목적을위한 것입니다 ThreadDeath
(AN Error
, 사람들은 담요 - 캐치 예외로 시도하고 자바의 디자이너는 일어나고 싶지 않았어 특히 때문에) 당신이 아무것도 (또는 사용을 던질 수 있지만, 일부 지점에서 API가 된 후 자바 디자이너들은이 아이디어가 엄청나게 나쁜 아이디어라는 것을 깨달았고 인수를 바로 취하는 메소드 버전을 제거했습니다). 물론, 던지는 버전조차도 ThreadDeath
상당히 위험한 작업으로 보증을 거의 할 수 없습니다 (예를 들어,이 퍼즐을 해결할 수 있습니다 ( "불가능")). 그것을 사용하지만 Java 8부터는 여전히 작동합니다.
이 프로그램은 새로운 스레드를 생성하고 강제로 예외를 메인 스레드에 다시 던지도록 요청함으로써 작동합니다. 운이 좋으면 내부 catch
블록 외부에있는 시점에서 그렇게 할 것입니다 ( catch
루프가 있기 때문에 프로그램이 끝날 때까지 외부 블록을 벗어날 수는 없습니다 ). 루프가 이미 편리하게 추가 되었기 때문에 단순히 루프를 사용하여 스레드를 계속 만들 수 있도록하는 것은 바이트 절약입니다. 스레드 중 하나가 올바른 타이밍에 도달하기를 바랍니다. 이것은 일반적으로 몇 초 안에 발생하는 것 같습니다.
(TIO 참고 : 현재 버전의 TIO는 생성 된 모든 스레드로 인해이 프로그램을 실행 초기에 강제 종료하는 경향이 있습니다. TIO에서 작동 할 수 있지만 안정적으로 작동하지 않으므로 몇 가지 시도가 필요합니다. "You won!"출력을 얻습니다.)