Нужно ли JNI отсоединять прикрепленную нить? - PullRequest
6 голосов
/ 22 декабря 2009

У меня есть собственный поток, который нужно вызвать на Java. Для этого мне нужно присоединить поток к виртуальной машине, используя AttachCurrentThread. Поскольку этот обратный вызов будет происходить довольно часто, поток, вероятно, должен оставаться подключенным. Многократный вызов AttachCurrentThread - это нормально («Попытка присоединить уже присоединенную нить - это бесполезно»)

Должен ли я вызывать DetachCurrentThread до завершения потока, произойдет ли это автоматически или даже не требуется? Что произойдет, если я должен позвонить отделить, но не делать? Будет ли это просто "утечка", или это может даже повредить состояние виртуальной машины?

Я проверил спецификацию нативного интерфейса Java, но либо пропустил это, либо он действительно не указан.

Мой вопрос относится именно к Sun JDK 6 в Windows XP.

1 Ответ

8 голосов
/ 22 декабря 2009

Я думаю, что подтверждение, которое вы хотите, здесь: http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/invocation.html#wp1060

Собственный поток, подключенный к ВМ, должен вызвать DetachCurrentThread (), чтобы отсоединиться перед выходом.

А в следующем разделе есть обоснование:

Виртуальная машина ожидает, пока текущий поток не станет единственным пользовательским потоком, не являющимся демоном, прежде чем он фактически выгружается Пользовательские потоки включают как потоки Java, так и вложенные собственные потоки.

...