Quelles sont les conséquences si nous essayons d'attacher un fil natif en permanence à la DVM (JVM)?

Est-il possible d'attacher un fil natif en permanence à la JVM (AttachCurrentThread) (ou) est-il préférable de s'attacher lorsque vous avez besoin (appeler des fonctions java) et de le détacher une fois que le travail est terminé

J'ai écrit un échantillon d'application natif avec les cas ci-dessus, n'a trouvé aucune différence. Mais en effectuant un googling, j'ai vaguement constaté que, lorsqu'il était attaché à JVM, la planification des threads JVM est responsable de la planification, sinon le système d'exploitation programmera le thread natif (s'il n'est pas attaché). Est-ce vrai?

  • Comment récupérer les cookies dans Retrofit?
  • Impossible de convertir à partir d'android.support.v4.app.Fragment to android.app.Fragment
  • RelativeLayout dans StackLayout Width Calculation
  • Comment changer la couleur de la barre d'outils de sélection de texte qui vient quand nous copions un texte?
  • ADB se déconnecte après quelques minutes
  • Comment modifier la couleur du texte de la fenêtre d'erreur pour un EditText?
  • Il est important de détacher tout thread précédemment attaché; Sinon, le programme ne quittera pas lorsque vous appelez DestroyJavaVM. – http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniref.html#attach

    Y aura-t-il des problèmes de performance?
    S'il vous plaît, faites-moi savoir si quelqu'un sait, c'est l'aspect mon aspect important.

    Merci et salutations.

  • Développement Android dans la tablette multifonctions Micromax
  • Erreur lors de l'utilisation de Android Design Support Library: attr backgroundTint introuvable
  • Remplacez les caractères par une image en chaîne, puis définissez la vue de texte
  • GSON lance "BEGIN_OBJECT attendu mais BEGIN_ARRAY"?
  • La fonction startPreview est lente, tout travail autour?
  • Java howto ArrayList push, pop, shift et unshift
  • 3 Solutions collect form web for “Quelles sont les conséquences si nous essayons d'attacher un fil natif en permanence à la DVM (JVM)?”

    D'une manière générale, le coût de performance principal est la création de threads au niveau du système d'exploitation. Soit le thread crée en natif, puis est attaché ou créé directement comme java.lang.Thread partir de l'API Java.

    Si vous réutilisez le même thread natif, les performances seront bonnes. Soit dit en passant, ne créez pas des dizaines de threads natifs.

    La JVM ne planifie pas les threads lui-même . Il peut les forcer en état de sommeil pour diverses raisons, comme la collecte des ordures. Dans ce cas particulier, il faut attendre un appel JNI d'un fil natif avant de collecter. Vous devez donc éviter une exécution de code trop longue sans appel JNI pour réduire la consommation de VM VM.

    De plus, vous devez prendre soin d'appeler DeleteLocalRef avant de détacher un thread natif, sinon votre VM perdra la mémoire.

    Lorsqu'un fil natif est attaché en permanence, ne peut pas quitter le thread natif. Il s'écrase lorsque nous essayons de quitter le fil natif sans se détacher. Mais lorsque nous nous sommes détachés, le thread natif a pu faire une sortie gracieuse.

    Je n'ai connu aucune conséquence, sauf pour des performances améliorées.

    C'est exactement ce que je fais dans une application qui ByteBuffer directement les données ByteBuffer entre les deux couches. J'ai découvert que le coût de l'attachement / détachement constamment était très élevé, comme on pouvait s'y attendre. Mon approche consiste à lancer un seul thread géré par Java qui déclenche un appel JNI de blocage au démarrage, qui dans la couche C / C ++ contient une boucle de type condition / signal (pour ne pas consommer de cycles CPU). Je peux alors signaler à la boucle si les données sont prêtes à être traitées et, à l'inverse, je peux signaler à Java lorsque le travail est dur.

     new Thread(() -> myBlockingJNICall()).start(); 

    Puis vers le bas dans la couche C:

     #ifdef __cplusplus extern "C" { #endif // __cplusplus static JavaVM *jvm = nullptr; // captures the JVM on load JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *the_jvm, void* /*reserved*/) { jvm = the_jvm; return JNI_VERSION_1_2; // must export 1_2 to use any of the new functions, 1_1 otherwise } JNIEXPORT jboolean JNICALL Java_myBlockingJNICall(JNIEnv *env, jobject) { // loop forever waiting for work and using env for signalling // jvm is stored in case we need to manually attach (or perform more complex work requiring jvm access) return JNI_TRUE; } #ifdef __cplusplus } #endif // __cplusplus 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.