Begrenzung der Anzahl von threads verwendet, die von der JVM
Festlegen Begrenzung für die Anzahl der Threads, die jemand erstellen kann? Was ich Tue, läuft jemand den code (so etwas wie ideone), und wollen, begrenzen Sie die Anzahl der Threads, die er erzeugen kann. Wie Sie dies tun? Einige jvm-Einstellung oder etwas anderes?
BEARBEITEN
Ich füge die angegebenen info, weil einige Leute sind nicht immer mein Punkt.
- Einige zufällige Kerl senden Sie mir einen code auf meinem computer ausführen wollen
- Code muss ausgeführt werden, innerhalb maximum von k-threads
- Alles muss automatisiert werden - arbeiten wie SPOJ, ideone, etc.
- java-byte-code injecter vielleicht? Wie ein java-profiler fügt aber hinzu, statt zu untersuchen. Begrenzen Sie den jvm-Speicher vor dem Start, aber nicht der genaue Wert kann es 1000 oder 10000, Gewinde Größe auch wichtig. Die Begrenzung der Speicher führen kann gegenteiligen Effekt.
- Verwenden Sie einen ThreadPool mit einem limit
- Es ist nicht mein code. Meine Maschine wird nur zu starten und was ich will, ist zu verbieten Ausgangspunkt neuer thread. Zum Beispiel kann es sogar zu Abstürzen, wenn jemand spawn-Thread, aber in jedem Fall kann es nicht ausführen. Wie Sie dies tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unter Linux, man könnte das Programm als eine separate Benutzer-und Verwendung der shell-Befehl
ulimit -u nprocs
zu begrenzen die Anzahl der threads (Prozesse) für diesen Benutzer. Wenn ein Versuch gemacht wird, die das limit überschreiten, die JVM wirft eineOutOfMemoryError
.Aber warum wollen Sie dies tun? Sind Sie besorgt, dass das Programm verbraucht alle CPU-Ressourcen des Computers? Wenn ja, möchten Sie vielleicht zu prüfen, läuft die JVM bei niedrigeren scheduling-Priorität, mit
nice
, so dass andere Prozesse werden bevorzugt die Verwendung der CPU:Mit
nice
auf diese Weise sollte reduziert die Priorität aller threads, aber es ist nicht klar, dass es so für Linux.Können Sie Ihre eigene Unterklasse von thread führt, dass die gewünschte Prüfung im Konstruktor(en) oder in der start-Methode.
Zur Gewährleistung der code, den Sie ausführen verwendet Ihre benutzerdefinierten thread-Klasse, müssen Sie laden Sie den code mit Ihrem eigenen class-loader und class-loader fängt einfach jede Anfrage für die java.lang.Thread-Klasse und Hände aus Ihre benutzerdefinierten statt Klasse (das Konzept kann erweitert werden, um andere Klassen auch).
Achtung: Umsetzung dies richtig ist nicht trivial.
AFAIK Limit ist rein hängt davon ab, dass das Betriebssystem nicht auf der JVM.
Und Sie Überwachen können, die Ihnen von Executor service -
Einen Testamentsvollstrecker, bietet Methoden zur Verwaltung der Beendigung und Methoden, die produzieren können, eine Zukunft für die Verfolgung der Fortschritte eines oder mehrere asynchrone tasks.