лучшая стратегия для прикрепления произвольных потоков к Android JVM - PullRequest
3 голосов
/ 25 января 2012

Мне нужно перезвонить в JVM с произвольного нативного темы, которые могут или не могут быть долгоживущими. Это достаточно просто позвонить AttachCurrentThread перед каждым вызовом метода Java на Предположение, что это (предположительно быстро) нет операции, если поток уже прикрепленный, но я задаюсь вопросом, что делает JVM с прикрепленным родные темы, когда они уходят куда-то на родину без будучи официально отделенным. Или, другими словами, это будет проблема? Если так, то я задаюсь вопросом о накладных расходах присоединение / отсоединение для каждого вызова метода Java. В идеале каждый поток будет регистрироваться при запуске и отключаться при завершении работы но опять же я пишу код, который должен вызываться из произвольного потоки запускают код, который не знает, что он работает внутри Android, так что это нереальный вариант в этом случае.

Есть мысли по этому поводу?

1 Ответ

2 голосов
/ 26 января 2012

Мне интересно, что JVM делает с присоединенными нативными потоками, когда они уходят куда-то на родной земле без официального отсоединения.

Обычная виртуальная машина отключается, когда всепотоки демона вышли.Присоединение потока без отсоединения означает, что виртуальная машина не может выйти и должна ждать, пока ваш поток отсоединится первым.Это всего лишь общий случай с виртуальной машиной.В Android это не должно быть проблемой, так как приложения на самом деле не «выходят». Источник .

Но отсоединение потоков настоятельно рекомендуется для правильного управления памятью (см. официальную рекомендацию ).

Я пишу код, который должен вызываться из произвольных потоков, выполняющих код, который даже не подозревает, что он работает внутри Android, поэтому в данном случае это нереальный вариант.

На самом деле реализация саморазрывной нити довольно проста.Передайте ссылку «деструктор» на pthread_key_create(destKey_, threadDestructor); и внутри этого «деструктора» вызовите метод JNI cached_jvm->DetachCurrentThread();.

Надеюсь, что это поможет!

...