3 Stimmen

Benutzerdefinierte Implementierung von Thread in Java: Ist das mit JNI möglich?

Wäre es möglich, eine benutzerdefinierte Thread-Klasse in Java (mit JNI) in eine sichere / korrekte Weise zu implementieren?

Angenommen, ich schreibe meine eigene NewThread Klasse, mit einer nativen start() Methode, die die Ausführung forkt, ruft run() im Forked-Thread und kehrt zurück...

Ist das möglich? Würde sich die JVM beschweren? Ist es nach den Spezifikationen "legal"? Würde das irgendetwas kaputt machen, z.B. im Speichermodell? Hängt es von der jeweiligen JVM ab?

1voto

hidralisk Punkte 676

Das ist möglich. In der Vergangenheit habe ich eine C++-Lib verwendet, die Nachrichten für den Socket liest. Nach der Initialisierung durch JNI startete die Bibliothek einige pthreads, die Daten vom Socket lasen und Aufrufe in der Java-Welt durch JNI ausführten. Die besagten pthreads griffen dabei ziemlich tief in den Java-Code ein. Die einzigen Probleme, die wir hatten, waren Speicherprobleme in der JNI-Naht. Nach dem Lesen der JNI-Dokumente und etwas Debugging waren die Probleme gelöst. Also, keine Probleme mit dem Speichermodell.

Ich weiß nicht, ob die JVM JIT auf der Grundlage der von JNI eingehenden Ausführungen auslöst, so dass es hier zu Leistungseinbußen kommen könnte.

Machbar, stellenweise knifflig. Wenn Sie mit Java-Threads zurechtkommen, sollten Sie dies vermeiden. Ich weiß, ich würde.

1voto

jarnbjo Punkte 33136

Ihre Fragen werden beantwortet in der Native Java-Schnittstelle Programmierhandbuch und Spezifikation, Abschnitt 8.1.5 .

Wichtig ist, dass die VM das gleiche Thread-Modell wie Ihr nativer Code verwendet. Einige der ersten Java-VMs verwendeten auf einigen Betriebssystemen (Linux) so genannte "grüne Threads", um Thread-Kontextwechsel zu emulieren, da das Betriebssystem selbst keine native Threading-Unterstützung bot. Diese "grünen Threads" wären nicht in der Lage, mit nativen Threads zu interagieren, wenn Sie eine dieser alten VMs auf einer neueren Betriebssystemversion mit nativer Thread-Unterstützung verwenden würden.

Seit Suns JRE 1.3 verwenden, glaube ich, alle "normalen" VMs direkt native Threads, was bedeutet, dass Sie selbst native Threads in JNI-Code verwenden können und erwarten, dass alles so funktioniert, wie Sie es erwarten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X