2009-12-22 5 views
6

J'ai un thread natif qui doit appeler Java. Pour cela, je dois attacher le fil à la machine virtuelle en utilisant AttachCurrentThread. Puisque ce rappel arrivera assez souvent, le thread devrait probablement rester attaché. L'appel AttachCurrentThread plusieurs fois est très bien (« Essayer d'attacher un fil qui est déjà attaché est un non-op. »)Dois-je JNI détacher un thread attaché?

Dois-je appeler DetachCurrentThread avant que les sorties de fil, cela arrivera automatiquement, ou est-ce même pas Champs obligatoires? Que se passe-t-il si je dois appeler détachement, mais ne le fais pas? Est-ce que cela «fuirait» ou pourrait-il même corrompre l'état de la machine virtuelle?

J'ai vérifié la spécification Java Native Interface, mais soit l'ai manquée, soit elle n'est pas spécifiée.

Ma question s'applique spécifiquement à Sun JDK 6 sur Windows XP.

Répondre

8

Je pense que la confirmation que vous voulez est ici: http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/invocation.html#wp1060

Un fil natif attaché à la machine virtuelle doit appeler DetachCurrentThread() pour se détacher avant de quitter.

Et dans la section suivante, il y a la raison d'être:

Le VM attend jusqu'à ce que le thread en cours est le seul thread utilisateur non-démon avant qu'il se décharge en fait. Les threads utilisateur incluent à la fois les threads Java et les threads natifs attachés.

+0

Darn, je regardais la spécification JDI JDK5 tout le temps. La section "Détacher de la machine virtuelle" est nouvelle dans les documents JDK6. Merci de votre aide! –

+0

Je souhaite qu'il y ait plus d'explications sur * pourquoi * il doit appeler DetachCurrentThread(). Si le thread natif est connecté en tant que démon, la machine virtuelle n'attendra pas le thread natif attaché pour terminer. – technomage