JavaRush /Blog Jawa /Random-JV /Ngopi #160. Nyilem jero menyang Java ThreadLocal. Kelas S...

Ngopi #160. Nyilem jero menyang Java ThreadLocal. Kelas Scanner ing Jawa

Diterbitake ing grup

Deep Dive menyang Java ThreadLocal

Sumber: Devgenios Dina iki sampeyan bakal sinau babagan ThreadLocal, salah sawijining kelas sing umum digunakake kanggo ngembangake aplikasi Java. Ngopi #160.  Nyilem jero menyang Java ThreadLocal.  Kelas Scanner ing Jawa - 1

Apa iku ThreadLocal?

Kelas ThreadLocal nyimpen variabel lokal kanggo benang. Variabel kasebut diisolasi ing antarane benang sing beda-beda lan mung bisa diakses dening benang dhewe. Gunakake kasus kanggo ThreadLocal :
  1. Isolasi data ing antarane benang.
  2. Manajemen sesi kanggo sambungan database.
  3. Nyimpen informasi transaksi thread.

Kepiye cara nggunakake ThreadLocal?

Ayo goleki conto sing prasaja.
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());
}
Ing kode ndhuwur, kita nggawe kelas ThreadLocal , nggawe 5 thread, nemtokake nilai kanggo ThreadLocal ing saben thread lan print. Nalika output kita entuk: Ngopi #160.  Nyilem jero menyang Java ThreadLocal.  Kelas Scanner ing Jawa - 2

Apa ing ngisor hood?

Yen sampeyan ndeleng kanthi teliti, sampeyan bisa ndeleng manawa ana rong cara penting ing ThreadLocal saka conto kode iki.
  • publik T entuk() {}

  • kumpulan void publik (nilai T) {}

Ayo goleki metode setter ing kode sumber 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);
}
Cara setter pisanan entuk thread saiki lan nelpon metode getMap () kanggo entuk kelas ThreadLocalMap . Yen peta ana, gunakake stream t saiki minangka kunci, parameter input minangka nilai, lan setel pasangan {key:value} menyang peta. Yen ora, banjur nggawe peta . Saiki sampeyan duwe pitakonan - apa 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 minangka kelas statis internal ing ThreadLocal sing nemtokake kelas Entri kanggo nyimpen data. Entri nggunakake conto ThreadLocal minangka kunci lan nyetel nilai sing dilewati. Yen iki muni banget mbingungake ing titik iki, mung elinga yen kelas Entry ing ThreadLocalMap sing nindakake nyimpen nilai nyata. Kanggo entuk data saka ThreadLocal kita nggunakake metode 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();
}
Ing metode getter , kita bakal nggunakake currentThread minangka kunci kanggo entuk ThreadLocalMap . Banjur map bakal getEntry () adhedhasar conto ThreadLocal lan ngasilake conto Entri banjur nilai sing disimpen. Mangkene diagram kanggo mbantu sampeyan ngerteni: Ngopi #160.  Nyilem jero menyang Java ThreadLocal.  Kelas Scanner ing Jawa - 3Ngopi #160.  Nyilem jero menyang Java ThreadLocal.  Kelas Scanner ing Jawa - 4
  1. Saben thread njaga referensi menyang ThreadLocalMap .

  2. ThreadLocalMap minangka kelas statis batin ThreadLocal lan nggunakake kelas Entry kanggo panyimpenan.

  3. Tombol ThreadLocalMap minangka conto saka ThreadLocal lan bisa duwe macem-macem ThreadLocals .

  4. ThreadLocal dhewe ora nyimpen nilai, nanging minangka kunci kanggo thread sing bakal mbantu entuk nilai saka ThreadLocalMap .

Elinga yen luwih apik kanggo mbusak ThreadLocal supaya OOM (Out-of-Memory Error) amarga referensi "lemah" ing kelas Entry .

Kelas Scanner ing Jawa

Sumber: Sedheng Kiriman iki bakal mbantu sampeyan kenal karo kelas Scanner ing basa Jawa. Ngopi #160.  Nyilem jero menyang Java ThreadLocal.  Kelas Scanner ing Jawa - 5Kelas Scanner ing Jawa minangka kelas sing digunakake nalika pengin entuk nilai saka pangguna. Cara sing paling gampang kanggo mangerteni yaiku kanthi conto, mula ayo dideleng kanthi luwih cetha. Nggawe kelas Scanner minangka salah siji saka telung langkah sing ditindakake kanggo entuk nilai saka pangguna. Langkah pisanan yaiku nggawe obyek saka kelas scanner.
Scanner scan=new Scanner(System.in);
Saiki kita duwe obyek scanner. Objek iki bakal duwe properti Scanner saka kelas Scanner . Sawise langkah pisanan, pangguna wis bisa nglebokake nilai sing dikarepake, nanging yen kita ora nuntun pangguna lan nampilake nilai kasebut ing konsol utawa ing aplikasi, mula ora bakal apik banget babagan panggunaan. Mula, luwih becik menehi informasi lan nuntun pangguna:
System.out.println("Please enter your name");
String name=scan.next();
System.out.println("Your Name:"+name);
Ing baris pisanan kita takon pangguna apa sing dikarepake saka dheweke. Iki pancene ora ana hubungane karo scanner, nanging mesthi apik kanggo menehi pitunjuk marang pangguna. Ing baris kapindho, kita bakal nemtokake nilai sing dilebokake pangguna menyang data lan simpen supaya bisa digunakake mengko. Ing baris pungkasan kita weruh yen kita bisa nggunakake nilai sing ditampa saka pangguna miturut kawicaksanan kita. Ayo nambah sawetara rincian liyane kanggo kode kita:
System.out.println("Please enter your last name");

String lastName=scan.next();

System.out.println("Your Name " + name + " " + "Your Last Name" + lastName);
Sejatine, kita mbaleni rong baris sadurunge, takon pangguna kanggo regane lan disimpen. Saiki ing baris pungkasan kita nggunakake rong nilai sing dijupuk saka pangguna lan saiki digunakake bebarengan.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION