2009-12-22 8 views
6

Ho un thread nativo che deve chiamare in Java. Per questo, ho bisogno di collegare il thread alla VM utilizzando AttachCurrentThread. Dal momento che questo richiamo avverrà abbastanza spesso, il thread dovrebbe probabilmente rimanere collegato. Chiamare AttachCurrentThread più volte va bene ("Cercando di collegare un thread che è già collegato è un no-op.")Devo JNI Staccare un thread allegato?

Devo chiamare DetachCurrentThread prima che il thread esca, accadrà automaticamente, o non è nemmeno necessario? Cosa succede se devo chiamare distaccare, ma non farlo? Sarebbe solo "leak", o potrebbe addirittura corrompere lo stato della VM?

Ho controllato la specifica di Java Native Interface, ma o l'ho persa, oppure è davvero non specificata.

La mia domanda riguarda specificamente Sun JDK 6 su Windows XP.

risposta

8

Penso che la conferma che si desidera è qui: http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/invocation.html#wp1060

Un thread nativo attaccato alla macchina virtuale deve chiamare DetachCurrentThread() per staccarsi prima di uscire.

E nella sezione successiva, c'è la logica:

La VM attende che il thread corrente è l'unico filo utente non daemon prima che venga scaricato effettivamente. I thread utente includono sia i thread Java che i thread nativi collegati.

+0

Dannazione, stavo guardando le specifiche JDK5 JNI tutto il tempo. La sezione "Scollegamento dalla VM" è nuova nei documenti JDK6. Grazie per l'aiuto! –

+0

Vorrei che ci fossero ulteriori spiegazioni su * perché * deve chiamare DetachCurrentThread(). Se il thread nativo è collegato come demone, la VM * non * aspetterà il completamento del thread nativo allegato. – technomage

Problemi correlati