JavaRush /Blog Java /Random-ES /Pausa para el café #160. Profundice en Java ThreadLocal. ...

Pausa para el café #160. Profundice en Java ThreadLocal. Clase de escáner en Java

Publicado en el grupo Random-ES

Profundización en Java ThreadLocal

Fuente: Devgenios Hoy aprenderá sobre ThreadLocal, una de las clases comunes utilizadas en el desarrollo de aplicaciones Java. Pausa para el café #160.  Profundice en Java ThreadLocal.  Clase de escáner en Java - 1

¿Qué es ThreadLocal?

La clase ThreadLocal almacena variables locales para subprocesos. Estas variables están aisladas entre diferentes subprocesos y solo sus propios subprocesos pueden acceder a ellas. Casos de uso para ThreadLocal :
  1. Aislar datos entre subprocesos.
  2. Gestión de sesiones para conexiones de bases de datos.
  3. Almacenamiento de información de transacciones de subprocesos.

¿Cómo utilizar ThreadLocal?

Veamos un ejemplo sencillo.
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(()-> {
        //Присваиваем significado каждому потоку
        local.set(a+"  "+random.nextInt(100));
        System.out.println("Thread number and its local value  "+ local.get());
    }).start());
}
En el código anterior, creamos una clase ThreadLocal , creamos 5 subprocesos, asignamos un valor a ThreadLocal en cada subproceso e imprimimos. Al generar obtenemos: Pausa para el café #160.  Profundice en Java ThreadLocal.  Clase de escáner en Java - 2

¿Qué hay debajo del capó?

Si observa de cerca, puede ver que hay dos métodos importantes en ThreadLocal en este ejemplo de código.
  • público T get() {}

  • conjunto de vacío público (valor T) {}

Veamos el método de establecimiento en el código fuente 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);
}
El método setter primero obtiene el hilo actual y llama al método getMap() para obtener la clase ThreadLocalMap . Si el mapa existe, tome la secuencia actual t como clave, el parámetro de entrada como valor y establezca el par {clave:valor} en mapa. Si no, entonces crea un mapa . Ahora puede que tengas una pregunta: ¿qué es 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 es una clase estática interna en ThreadLocal que define una clase de entrada para almacenar datos. Entry usa la instancia ThreadLocal como clave y establece el valor que pasamos. Si esto suena demasiado confuso en este punto, recuerde que es la clase Entry en ThreadLocalMap la que almacena los valores. Para obtener datos de ThreadLocal utilizamos el método 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();
}
En el método getter , usaremos currentThread como clave para obtener ThreadLocalMap . Luego, el mapa obtendráEntry () según la instancia de ThreadLocal y devolverá la instancia de Entry y luego el valor almacenado. Aquí tienes un diagrama que te ayudará a resolverlo: Pausa para el café #160.  Profundice en Java ThreadLocal.  Clase de escáner en Java - 3Pausa para el café #160.  Profundice en Java ThreadLocal.  Clase de escáner en Java - 4
  1. Cada hilo mantiene una referencia a un ThreadLocalMap .

  2. ThreadLocalMap es una clase estática interna de ThreadLocal y utiliza la clase Entry para almacenamiento.

  3. Una clave ThreadLocalMap es una instancia de ThreadLocal y puede tener varios ThreadLocals .

  4. ThreadLocal en sí no almacena un valor, pero es una clave para el hilo que ayudará a obtener el valor de ThreadLocalMap .

Tenga en cuenta que es mejor eliminar ThreadLocal para evitar OOM (error de falta de memoria) debido a una referencia "débil" en la clase Entry .

Clase de escáner en Java

Fuente: Medio Esta publicación lo ayudará a familiarizarse con la clase Scanner en Java. Pausa para el café #160.  Profundice en Java ThreadLocal.  Clase de escáner en Java - 5La clase Scanner en Java es una clase que usamos cuando queremos obtener un valor del usuario. La forma más sencilla de entenderlo es con ejemplos, así que veámoslo más claramente. Crear una clase de escáner es uno de los tres pasos que damos para obtener un valor del usuario. El primer paso es crear un objeto a partir de la clase de escáner.
Scanner scan=new Scanner(System.in);
Ahora tenemos un objeto escáner. Este objeto tendrá las propiedades de Escáner de la clase Escáner . Después del primer paso, el usuario ya puede ingresar el valor deseado, pero si no lo guiamos y mostramos el valor en la consola o en la aplicación, no será muy bueno en términos de usabilidad. Por ello, es mejor informar y orientar al usuario:
System.out.println("Please enter your name");
String name=scan.next();
System.out.println("Your Name:"+name);
En la primera línea preguntamos al usuario qué queremos de él. En realidad, esto no tiene nada que ver con el escáner, pero siempre es bueno dar pistas a los usuarios. En la segunda línea asignaremos el valor que el usuario ingresa en los datos y lo guardaremos para poder usarlo más adelante. En la última línea vemos que podemos utilizar el valor recibido del usuario a nuestra discreción. Agreguemos algunos detalles más a nuestro código:
System.out.println("Please enter your last name");

String lastName=scan.next();

System.out.println("Your Name " + name + " " + "Your Last Name" + lastName);
Básicamente, repetimos las dos líneas anteriores, le preguntamos al usuario el valor y lo guardamos. Ahora en la última línea usamos dos valores que tomamos del usuario y que ahora se usan juntos.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION