JavaRush /Java-Blog /Random-DE /Kaffeepause Nr. 160. Tauchen Sie tief in Java ThreadLocal...

Kaffeepause Nr. 160. Tauchen Sie tief in Java ThreadLocal ein. Scannerklasse in Java

Veröffentlicht in der Gruppe Random-DE

Tauchen Sie tief in Java ThreadLocal ein

Quelle: Devgenios Heute lernen Sie ThreadLocal kennen, eine der häufigsten Klassen, die bei der Entwicklung von Java-Anwendungen verwendet werden. Kaffeepause Nr. 160.  Tauchen Sie tief in Java ThreadLocal ein.  Scannerklasse in Java - 1

Was ist ThreadLocal?

Die ThreadLocal- Klasse speichert lokale Variablen für Threads. Diese Variablen sind zwischen verschiedenen Threads isoliert und können nur von ihrem eigenen Thread aufgerufen werden. Anwendungsfälle für ThreadLocal :
  1. Isolieren Sie Daten zwischen Threads.
  2. Sitzungsverwaltung für Datenbankverbindungen.
  3. Speichern von Thread-Transaktionsinformationen.

Wie verwende ich ThreadLocal?

Schauen wir uns ein einfaches Beispiel an.
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(()-> {
        //Присваиваем Bedeutung каждому потоку
        local.set(a+"  "+random.nextInt(100));
        System.out.println("Thread number and its local value  "+ local.get());
    }).start());
}
Im obigen Code erstellen wir eine ThreadLocal- Klasse , erstellen 5 Threads, weisen ThreadLocal in jedem Thread einen Wert zu und drucken. Bei der Ausgabe erhalten wir: Kaffeepause Nr. 160.  Tauchen Sie tief in Java ThreadLocal ein.  Scannerklasse in Java - 2

Was steckt unter der Haube?

Wenn Sie genau hinschauen, können Sie anhand dieses Codebeispiels erkennen, dass es in ThreadLocal zwei wichtige Methoden gibt .
  • öffentliches T get() {}

  • öffentliche Leermenge (T-Wert) {}

Schauen wir uns die Setter- Methode im ThreadLocal- Quellcode an :
public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
}
Die Setter- Methode ruft zunächst den aktuellen Thread ab und ruft die Methode getMap() auf, um die ThreadLocalMap- Klasse abzurufen . Wenn eine Karte vorhanden ist, nehmen Sie den aktuellen Stream t als Schlüssel, den Eingabeparameter als Wert und legen Sie das Paar {key:value} auf „map“ fest. Wenn nicht, erstellen Sie eine Karte . Jetzt haben Sie vielleicht eine Frage: Was ist 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 ist eine interne statische Klasse in ThreadLocal , die eine Entry- Klasse zum Speichern von Daten definiert . Entry verwendet die ThreadLocal- Instanz als Schlüssel und legt den Wert fest, den wir übergeben. Wenn das an dieser Stelle zu verwirrend klingt, denken Sie daran, dass es die Entry- Klasse in ThreadLocalMap ist , die die eigentliche Speicherung der Werte übernimmt. Um Daten von ThreadLocal abzurufen, verwenden wir die Getter- Methode :
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();
}
In der Getter- Methode verwenden wir currentThread als Schlüssel, um die ThreadLocalMap abzurufen . Dann ruft Map getEntry() basierend auf der ThreadLocal- Instanz auf und gibt die Entry- Instanz und dann den gespeicherten Wert zurück. Hier ist ein Diagramm, das Ihnen helfen soll, es herauszufinden: Kaffeepause Nr. 160.  Tauchen Sie tief in Java ThreadLocal ein.  Scannerklasse in Java - 3Kaffeepause Nr. 160.  Tauchen Sie tief in Java ThreadLocal ein.  Scannerklasse in Java - 4
  1. Jeder Thread verwaltet einen Verweis auf eine ThreadLocalMap .

  2. ThreadLocalMap ist eine innere statische Klasse von ThreadLocal und verwendet die Entry- Klasse zur Speicherung.

  3. Ein ThreadLocalMap- Schlüssel ist eine Instanz von ThreadLocal und kann mehrere ThreadLocals haben .

  4. ThreadLocal selbst speichert keinen Wert, aber es ist ein Schlüssel für den Thread, der dabei hilft, den Wert von ThreadLocalMap abzurufen .

Beachten Sie, dass es besser ist, ThreadLocal zu entfernen , um OOM (Out-of-Memory Error) aufgrund einer „schwachen“ Referenz in der Entry- Klasse zu vermeiden .

Scannerklasse in Java

Quelle: Medium Dieser Beitrag wird Ihnen helfen, sich mit der Scanner-Klasse in Java vertraut zu machen. Kaffeepause Nr. 160.  Tauchen Sie tief in Java ThreadLocal ein.  Scannerklasse in Java - 5Die Scanner- Klasse in Java ist eine Klasse, die wir verwenden, wenn wir einen Wert vom Benutzer erhalten möchten. Der einfachste Weg, es zu verstehen, sind Beispiele, also schauen wir es uns genauer an. Das Erstellen einer Scanner- Klasse ist einer von drei Schritten, die wir unternehmen, um einen Wert vom Benutzer zu erhalten. Der erste Schritt besteht darin, ein Objekt aus der Scannerklasse zu erstellen.
Scanner scan=new Scanner(System.in);
Jetzt haben wir ein Scannerobjekt. Dieses Objekt verfügt über die Scanner-Eigenschaften der Scanner- Klasse . Nach dem ersten Schritt kann der Benutzer bereits den gewünschten Wert eingeben. Wenn wir den Benutzer jedoch nicht anleiten und den Wert in der Konsole oder in der Anwendung anzeigen, ist dies hinsichtlich der Benutzerfreundlichkeit nicht sehr gut. Daher ist es besser, den Benutzer zu informieren und anzuleiten:
System.out.println("Please enter your name");
String name=scan.next();
System.out.println("Your Name:"+name);
In der ersten Zeile fragen wir den Nutzer, was wir von ihm wollen. Das hat eigentlich nichts mit dem Scanner zu tun, aber es ist immer gut, seinen Benutzern Hinweise zu geben. In der zweiten Zeile weisen wir den Wert zu, den der Benutzer in die Daten eingibt, und speichern ihn, damit wir ihn später verwenden können. In der letzten Zeile sehen wir, dass wir den vom Benutzer erhaltenen Wert nach eigenem Ermessen verwenden können. Fügen wir unserem Code noch ein paar Details hinzu:
System.out.println("Please enter your last name");

String lastName=scan.next();

System.out.println("Your Name " + name + " " + "Your Last Name" + lastName);
Im Grunde haben wir die beiden vorherigen Zeilen wiederholt, den Benutzer nach dem Wert gefragt und ihn gespeichert. Nun haben wir in der letzten Zeile zwei Werte verwendet, die wir vom Benutzer übernommen haben und die nun zusammen verwendet werden.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION