2009-12-22 14 views
6

Tengo un hilo nativo que necesita llamar a Java. Para eso, necesito adjuntar el hilo a la VM usando AttachCurrentThread. Como esta devolución de llamada ocurrirá con bastante frecuencia, el hilo probablemente debería permanecer adjunto. Llamando AttachCurrentThread varias veces está muy bien ("Tratar de unir un hilo que se asocia ya es un no-op.")¿Tengo que desconectar JNI un hilo conectado?

¿Tengo que llamar DetachCurrentThread antes el hilo termina, va a suceder de forma automática, o no lo es incluso ¿necesario? ¿Qué sucede si debo llamar a detach, pero no? ¿Simplemente se "fugaría" o podría incluso dañar el estado de la máquina virtual?

He comprobado la especificación de la interfaz nativa de Java, pero o no lo he visto o realmente no está especificado.

Mi pregunta se aplica específicamente a Sun JDK 6 en Windows XP.

Respuesta

8

creo que la confirmación de que desea está aquí: http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/invocation.html#wp1060

Un hilo nativa unida a la máquina virtual debe llamar a DetachCurrentThread() para desprenderse antes de salir.

Y en la siguiente sección, está la razón de ser:

El VM espera hasta que el hilo actual es el único hilo usuario que no sea el demonio antes de que realmente se descarga. Los subprocesos de usuario incluyen tanto subprocesos de Java como subprocesos nativos asociados.

+0

Darn, estaba mirando la especificación JDK5 JNI todo el tiempo. La sección "Separar de la máquina virtual" es nueva en los documentos JDK6. ¡Gracias por tu ayuda! –

+0

Me gustaría que hubiera más explicaciones sobre * why * debe llamar a DetachCurrentThread(). Si el hilo nativo está conectado como daemon, entonces la VM * no * esperará a que termine el hilo nativo adjunto. – technomage