Maison Java javaDidacticiel Priorité du thread Java

Priorité du thread Java

Sep 26, 2019 pm 03:37 PM
java

Priorité du thread Java

Priorité du thread Java

Dans la classe Thread, les attributs suivants sont utilisés pour représenter la priorité.

private int priority;
Copier après la connexion

Nous pouvons définir une nouvelle priorité via setPriority(int newPriority) et obtenir la priorité du thread via getPriority().

Quelques informations permettent de conclure à travers l'exemple suivant : la priorité par défaut des threads Java est 5.

public static void main(String[] args) {
    Thread thread = new Thread();
    System.out.println(thread.getPriority());
}
// 打印结果:5
Copier après la connexion

En fait, c'est complètement faux. Je viens de voir la surface. Regardez l'exemple ci-dessous. Nous avons changé la priorité du fil de discussion actuel à 4 et avons constaté que la priorité du fil de discussion enfant est également de 4. .

public static void main(String[] args) {
    Thread.currentThread().setPriority(4);
    Thread thread = new Thread();
    System.out.println(thread.getPriority());
}

// 打印结果:4
Copier après la connexion

C'est une gifle. Si la priorité par défaut d'un fil est de 5, notre fil de discussion nouvellement créé n'a pas de priorité définie. Elle devrait être de 5, mais elle est en fait de 4. Jetons un coup d'œil au code source de la priorité d'initialisation du Thread.

Thread parent = currentThread();
this.priority = parent.getPriority();
Copier après la connexion

Il s'avère que la priorité par défaut d'un thread est d'hériter de la priorité du thread parent. Dans l'exemple ci-dessus, nous définissons la priorité du thread parent à 4, donc la priorité du thread enfant. devient également 4.

À proprement parler, la priorité par défaut du thread enfant est la même que celle du thread parent, et la priorité par défaut du thread principal Java est 5.

Il y a trois priorités définies en Java, à savoir la priorité la plus basse (1), la priorité normale (5) et la priorité la plus élevée (10). Le code est le suivant. La plage de priorités Java est [1, 10], la définition de la priorité d'autres nombres lèvera une exception IllegalArgumentException.

/**
 * The minimum priority that a thread can have.
 */
public final static int MIN_PRIORITY = 1;

/**
 * The default priority that is assigned to a thread.
 */
public final static int NORM_PRIORITY = 5;

/**
 * The maximum priority that a thread can have.
 */
public final static int MAX_PRIORITY = 10;
Copier après la connexion

Ensuite, parlons du rôle de la priorité des threads. Examinons d'abord le code suivant. La logique du code consiste à créer 3 000 threads, qui sont : 1 000 threads avec priorité 1, 1 000 threads avec priorité 5 et 1 000 threads avec priorité 10. Utilisez minTimes pour enregistrer la somme des horodatages d'exécution de 1 000 threads MIN_PRIORITY, utilisez normTimes pour enregistrer la somme des horodatages d'exécution de 1 000 threads NORM_PRIORITY et utilisez maxTimes pour enregistrer la somme des horodatages d'exécution de 1 000 threads MAX_PRIORITY. En comptant la somme des horodatages en cours de chaque niveau de priorité, plus la valeur est petite, plus la priorité est élevée. Exécutons-le et voyons.

public class TestPriority {
    static AtomicLong minTimes = new AtomicLong(0);
    static AtomicLong normTimes = new AtomicLong(0);
    static AtomicLong maxTimes = new AtomicLong(0);

    public static void main(String[] args) {
        List<MyThread> minThreadList = new ArrayList<>();
        List<MyThread> normThreadList = new ArrayList<>();
        List<MyThread> maxThreadList = new ArrayList<>();

        int count = 1000;
        for (int i = 0; i < count; i++) {
            MyThread myThread = new MyThread("min----" + i);
            myThread.setPriority(Thread.MIN_PRIORITY);
            minThreadList.add(myThread);
        }
        for (int i = 0; i < count; i++) {
            MyThread myThread = new MyThread("norm---" + i);
            myThread.setPriority(Thread.NORM_PRIORITY);
            normThreadList.add(myThread);
        }
        for (int i = 0; i < count; i++) {
            MyThread myThread = new MyThread("max----" + i);
            myThread.setPriority(Thread.MAX_PRIORITY);
            maxThreadList.add(myThread);
        }

        for (int i = 0; i < count; i++) {
            maxThreadList.get(i).start();
            normThreadList.get(i).start();
            minThreadList.get(i).start();
        }

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("maxPriority 统计:" + maxTimes.get());
        System.out.println("normPriority 统计:" + normTimes.get());
        System.out.println("minPriority 统计:" + minTimes.get());
        System.out.println("普通优先级与最高优先级相差时间:" + (normTimes.get() - maxTimes.get()) + "ms");
        System.out.println("最低优先级与普通优先级相差时间:" + (minTimes.get() - normTimes.get()) + "ms");

    }

    static class MyThread extends Thread {

        public MyThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            System.out.println(this.getName() + " priority: " + this.getPriority());
            switch (this.getPriority()) {
                case Thread.MAX_PRIORITY :
                    maxTimes.getAndAdd(System.currentTimeMillis());
                    break;
                case Thread.NORM_PRIORITY :
                    normTimes.getAndAdd(System.currentTimeMillis());
                    break;
                case Thread.MIN_PRIORITY :
                    minTimes.getAndAdd(System.currentTimeMillis());
                    break;
                default:
                    break;
            }
        }
    }
}
Copier après la connexion

Les résultats de l'exécution sont les suivants :

# 第一部分
max----0 priority: 10
norm---0 priority: 5
max----1 priority: 10
max----2 priority: 10
norm---2 priority: 5
min----4 priority: 1
.......
max----899 priority: 10
min----912 priority: 1
min----847 priority: 5
min----883 priority: 1

# 第二部分
maxPriority 统计:1568986695523243
normPriority 统计:1568986695526080
minPriority 统计:1568986695545414
普通优先级与最高优先级相差时间:2837ms
最低优先级与普通优先级相差时间:19334ms
Copier après la connexion

Analysons les résultats ensemble. Regardons d'abord la première partie. Les threads exécutés au début ont une priorité élevée, une priorité normale et une priorité faible. Les threads exécutés à la fin ont également des priorités différentes. Cela montre que : les threads avec une priorité élevée ne signifient pas nécessairement une priorité plus élevée. que les threads avec une priorité plus élevée, les threads avec une priorité inférieure sont exécutés en premier. Vous pouvez également le dire autrement : l’ordre d’exécution du code n’a rien à voir avec la priorité du thread. En regardant les résultats de la deuxième partie, nous pouvons constater que la somme des horodatages d'exécution des 1000 threads avec la priorité la plus élevée est la plus petite, tandis que la somme des horodatages d'exécution des 1000 threads avec la priorité la plus basse est la plus grande. Par conséquent, nous pouvons savoir : un lot de threads à haute priorité sera exécuté en premier qu'un lot de threads à faible priorité, c'est-à-dire que les threads à haute priorité sont plus susceptibles d'obtenir des ressources CPU que les threads à faible priorité.

Y a-t-il vraiment 10 niveaux de thread dans chaque système d'exploitation ?

En tant que langage multiplateforme, Java dispose de 10 niveaux de threads, mais les valeurs de priorité des threads mappées aux différents systèmes d'exploitation sont différentes. Ensuite, je vais vous apprendre à vérifier la valeur du mappage de priorité des threads dans chaque système d'exploitation dans le code source OpenJDK.

En voyant le code source du Thread, définir la priorité du thread appelle finalement la méthode locale setPriority0();

private native void setPriority0(int newPriority);
Copier après la connexion

Puis on retrouve la méthode JVM_SetThreadPriority correspondant à setPriority0() dans le code Thread.c de OpenJDK ;

static JNINativeMethod methods[] = {
    ...
    {"setPriority0",     "(I)V",       (void *)&JVM_SetThreadPriority},
    ...};
Copier après la connexion

Nous trouvons le segment de code correspondant dans jvm.cpp basé sur JVM_SetThreadPriority;

JVM_ENTRY(void, JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio))
  JVMWrapper("JVM_SetThreadPriority");
  // Ensure that the C++ Thread and OSThread structures aren&#39;t freed before we operate
  MutexLocker ml(Threads_lock);
  oop java_thread = JNIHandles::resolve_non_null(jthread);
  java_lang_Thread::set_priority(java_thread, (ThreadPriority)prio);
  JavaThread* thr = java_lang_Thread::thread(java_thread);
  if (thr != NULL) {                  // Thread not yet started; priority pushed down when it is
    Thread::set_priority(thr, (ThreadPriority)prio);
  }
JVM_END
Copier après la connexion

Sur la base du code de l'étape 3, nous pouvons constater que la clé est le code java_lang_Thread :: set_Priority() , continuez à chercher la méthode set_Priority() dans le code thread.cpp

void Thread::set_priority(Thread* thread, ThreadPriority priority) {
  trace("set priority", thread);
  debug_only(check_for_dangling_thread_pointer(thread);)
  // Can return an error!
  (void)os::set_priority(thread, priority);
}
Copier après la connexion
 ;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

See all articles