JavaRush /Blog Java /Random-FR /Pause café #160. Plongez en profondeur dans Java ThreadLo...

Pause café #160. Plongez en profondeur dans Java ThreadLocal. Classe de scanner en Java

Publié dans le groupe Random-FR

Plongez en profondeur dans Java ThreadLocal

Source : Devgenios Aujourd'hui, vous découvrirez ThreadLocal, l'une des classes courantes utilisées dans le développement d'applications Java. Pause café #160.  Plongez en profondeur dans Java ThreadLocal.  Classe de scanner en Java - 1

Qu’est-ce que ThreadLocal ?

La classe ThreadLocal stocke les variables locales pour les threads. Ces variables sont isolées entre différents threads et ne sont accessibles que par leur propre thread. Cas d'utilisation de ThreadLocal :
  1. Isolez les données entre les threads.
  2. Gestion des sessions pour les connexions aux bases de données.
  3. Stockage des informations sur les transactions de thread.

Comment utiliser ThreadLocal ?

Regardons un exemple simple.
public static void main(String[] args) {
    //Создаем ThreadLocal
    ThreadLocal<String> local = new ThreadLocal<>();
    //Создаем новый класс Random
    Random random = new Random();
    //Создаем 5 потоков
    IntStream.range(0, 5).forEach(a-> new Thread(()-> {
        //Присваиваем meaning каждому потоку
        local.set(a+"  "+random.nextInt(100));
        System.out.println("Thread number and its local value  "+ local.get());
    }).start());
}
Dans le code ci-dessus, nous créons une classe ThreadLocal , créons 5 threads, attribuons une valeur à ThreadLocal dans chaque thread et imprimons. Lors de la sortie, nous obtenons : Pause café #160.  Plongez en profondeur dans Java ThreadLocal.  Classe de scanner en Java - 2

Qu'y a-t-il sous le capot ?

Si vous regardez attentivement, vous pouvez voir qu'il existe deux méthodes importantes dans ThreadLocal à partir de cet exemple de code.
  • public T obtenir() {}

  • ensemble public vide (valeur T) {}

Regardons la méthode setter dans le code source de ThreadLocal :
public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
}
La méthode setter récupère d'abord le thread actuel et appelle la méthode getMap() pour obtenir la classe ThreadLocalMap . Si map existe, prenez le flux actuel t comme clé, le paramètre d'entrée comme valeur et définissez la paire {key:value} sur map. Sinon, créez une carte . Maintenant, vous avez peut-être une question : qu'est-ce que ThreadLocalMap ?
static class ThreadLocalMap {
   /**
    * The entries in this hash map extend WeakReference, using
    * its main ref field as the key (which is always a
    * ThreadLocal object).  Note that null keys (i.e. entry.get()
    * == null) mean that the key is no longer referenced, so the
    * entry can be expunged from table.  Such entries are referred to
    * as "stale entries" in the code that follows.
    */
    static class Entry extends WeakReference<ThreadLocal<?>> {
       /** The value associated with this ThreadLocal. */
       Object value;
       Entry(ThreadLocal<?> k, Object v) {
           super(k);
           value = v;
       }
    }
}
ThreadLocalMap est une classe statique interne dans ThreadLocal qui définit une classe Entry pour stocker les données. Entry utilise l' instance ThreadLocal comme clé et définit la valeur que nous transmettons. Si cela semble trop déroutant à ce stade, rappelez-vous simplement que c'est la classe Entry de ThreadLocalMap qui effectue le stockage réel des valeurs. Pour obtenir des données de ThreadLocal , nous utilisons la méthode getter :
public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
}
Dans la méthode getter , nous utiliserons currentThread comme clé pour obtenir le ThreadLocalMap . Ensuite, map getEntry () basé sur l' instance ThreadLocal et renverra l' instance Entry puis la valeur stockée. Voici un schéma pour vous aider à comprendre : Pause café #160.  Plongez en profondeur dans Java ThreadLocal.  Classe de scanner en Java - 3Pause café #160.  Plongez en profondeur dans Java ThreadLocal.  Classe de scanner en Java - 4
  1. Chaque thread conserve une référence à un ThreadLocalMap .

  2. ThreadLocalMap est une classe statique interne de ThreadLocal et utilise la classe Entry pour le stockage.

  3. Une clé ThreadLocalMap est une instance de ThreadLocal et peut avoir plusieurs ThreadLocals .

  4. ThreadLocal lui-même ne stocke pas de valeur, mais c'est une clé pour le thread qui aidera à obtenir la valeur de ThreadLocalMap .

Notez qu'il est préférable de supprimer ThreadLocal pour éviter le MOO (Out-of-Memory Error) dû à une référence « faible » dans la classe Entry .

Classe de scanner en Java

Source : Medium Cet article vous aidera à vous familiariser avec la classe Scanner en Java. Pause café #160.  Plongez en profondeur dans Java ThreadLocal.  Classe de scanner en Java - 5La classe Scanner en Java est une classe que nous utilisons lorsque nous voulons obtenir une valeur de l'utilisateur. La façon la plus simple de le comprendre est d'utiliser des exemples, alors regardons-le plus clairement. La création d'une classe Scanner est l'une des trois étapes que nous suivons pour obtenir une valeur de l'utilisateur. La première étape consiste à créer un objet à partir de la classe scanner.
Scanner scan=new Scanner(System.in);
Nous avons maintenant un objet scanner. Cet objet aura les propriétés Scanner de la classe Scanner . Après la première étape, l'utilisateur peut déjà saisir la valeur souhaitée, mais si nous ne guidons pas l'utilisateur et n'affichons pas la valeur dans la console ou dans l'application, ce ne sera pas très bon en termes de convivialité. Il est donc préférable d’informer et de guider l’utilisateur :
System.out.println("Please enter your name");
String name=scan.next();
System.out.println("Your Name:"+name);
Dans la première ligne, nous demandons à l'utilisateur ce que nous attendons de lui. Cela n'a en réalité rien à voir avec le scanner, mais il est toujours bon de donner des indices à vos utilisateurs. Dans la deuxième ligne, nous attribuerons la valeur que l'utilisateur entre dans les données et la sauvegarderons afin que nous puissions l'utiliser plus tard. Dans la dernière ligne, nous voyons que nous pouvons utiliser la valeur reçue de l'utilisateur à notre discrétion. Ajoutons quelques détails supplémentaires à notre code :
System.out.println("Please enter your last name");

String lastName=scan.next();

System.out.println("Your Name " + name + " " + "Your Last Name" + lastName);
Fondamentalement, nous avons répété les deux lignes précédentes, demandé la valeur à l'utilisateur et l'avons enregistrée. Maintenant, dans la dernière ligne, nous avons utilisé deux valeurs que nous avons prises auprès de l'utilisateur et qui sont désormais utilisées ensemble.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION