JavaRush /Blog Java /Random-MS /Coffee break #160. Menyelam dalam-dalam Java ThreadLocal....

Coffee break #160. Menyelam dalam-dalam Java ThreadLocal. Kelas pengimbas di Jawa

Diterbitkan dalam kumpulan

Selam dalam Java ThreadLocal

Sumber: Devgenios Hari ini anda akan belajar tentang ThreadLocal, salah satu kelas biasa yang digunakan dalam membangunkan aplikasi Java. Coffee break #160.  Menyelam dalam-dalam Java ThreadLocal.  Kelas pengimbas dalam Java - 1

Apakah ThreadLocal?

Kelas ThreadLocal menyimpan pembolehubah tempatan untuk benang. Pembolehubah ini diasingkan antara urutan yang berbeza dan hanya boleh diakses oleh utas mereka sendiri. Gunakan kes untuk ThreadLocal :
  1. Asingkan data antara benang.
  2. Pengurusan sesi untuk sambungan pangkalan data.
  3. Menyimpan maklumat transaksi benang.

Bagaimana untuk menggunakan ThreadLocal?

Mari kita lihat contoh mudah.
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());
}
Dalam kod di atas, kami mencipta kelas ThreadLocal , mencipta 5 utas, menetapkan nilai kepada ThreadLocal dalam setiap utas dan mencetak. Apabila mengeluarkan kita mendapat: Coffee break #160.  Menyelam dalam-dalam Java ThreadLocal.  Kelas pengimbas dalam Java - 2

Apa yang ada di bawah tudung?

Jika anda melihat dengan teliti, anda boleh melihat bahawa terdapat dua kaedah penting dalam ThreadLocal daripada contoh kod ini.
  • awam T dapatkan() {}

  • set kekosongan awam (nilai T) {}

Mari lihat kaedah penetap dalam kod 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);
}
Kaedah setter mula-mula mendapat benang semasa dan memanggil kaedah getMap() untuk mendapatkan kelas ThreadLocalMap . Jika peta wujud, ambil strim semasa t sebagai kunci, parameter input sebagai nilai dan tetapkan pasangan {key:value} untuk dipetakan. Jika tidak, buat peta . Sekarang anda mungkin mempunyai soalan - apakah itu 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 ialah kelas statik dalaman dalam ThreadLocal yang mentakrifkan kelas Kemasukan untuk menyimpan data. Entri menggunakan contoh ThreadLocal sebagai kunci dan menetapkan nilai yang kami luluskan. Jika ini kedengaran terlalu mengelirukan pada ketika ini, ingatlah bahawa kelas Kemasukan dalam ThreadLocalMap yang melakukan penyimpanan nilai sebenar. Untuk mendapatkan data daripada ThreadLocal kami menggunakan kaedah 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();
}
Dalam kaedah getter , kami akan menggunakan currentThread sebagai kunci untuk mendapatkan ThreadLocalMap . Kemudian map akan getEntry() berdasarkan contoh ThreadLocal dan mengembalikan contoh Entry dan kemudian nilai yang disimpan. Berikut ialah rajah untuk membantu anda memikirkannya: Coffee break #160.  Menyelam dalam-dalam Java ThreadLocal.  Kelas pengimbas dalam Java - 3Coffee break #160.  Menyelam dalam-dalam Java ThreadLocal.  Kelas pengimbas dalam Java - 4
  1. Setiap urutan mengekalkan rujukan kepada ThreadLocalMap .

  2. ThreadLocalMap ialah kelas statik dalaman ThreadLocal dan menggunakan kelas Entry untuk penyimpanan.

  3. Kunci ThreadLocalMap ialah contoh ThreadLocal dan boleh mempunyai berbilang ThreadLocals .

  4. ThreadLocal sendiri tidak menyimpan nilai, tetapi ia adalah kunci untuk utas yang akan membantu mendapatkan nilai daripada ThreadLocalMap .

Ambil perhatian bahawa adalah lebih baik untuk mengalih keluar ThreadLocal untuk mengelakkan OOM (Out-of-Memory Error) disebabkan rujukan "lemah" dalam kelas Kemasukan .

Kelas pengimbas di Jawa

Sumber: Sederhana Siaran ini akan membantu anda membiasakan diri dengan kelas Pengimbas di Java. Coffee break #160.  Menyelam dalam-dalam Java ThreadLocal.  Kelas pengimbas dalam Java - 5Kelas Pengimbas dalam Java ialah kelas yang kita gunakan apabila kita ingin mendapatkan nilai daripada pengguna. Cara paling mudah untuk memahaminya ialah dengan contoh, jadi mari kita lihat dengan lebih jelas. Mencipta kelas Pengimbas ialah salah satu daripada tiga langkah yang kami ambil untuk mendapatkan nilai daripada pengguna. Langkah pertama ialah mencipta objek daripada kelas pengimbas.
Scanner scan=new Scanner(System.in);
Sekarang kita mempunyai objek pengimbas. Objek ini akan mempunyai sifat Pengimbas daripada kelas Pengimbas . Selepas langkah pertama, pengguna sudah boleh memasukkan nilai yang dikehendaki, tetapi jika kita tidak membimbing pengguna dan memaparkan nilai dalam konsol atau dalam aplikasi, ia tidak akan menjadi sangat baik dari segi kebolehgunaan. Oleh itu, adalah lebih baik untuk memaklumkan dan membimbing pengguna:
System.out.println("Please enter your name");
String name=scan.next();
System.out.println("Your Name:"+name);
Dalam baris pertama kami bertanya kepada pengguna apa yang kami mahu daripadanya. Ini sebenarnya tiada kaitan dengan pengimbas, tetapi ia sentiasa baik untuk memberi petunjuk kepada pengguna anda. Dalam baris kedua kami akan menetapkan nilai yang dimasukkan oleh pengguna ke dalam data dan menyimpannya supaya kami boleh menggunakannya kemudian. Dalam baris terakhir kami melihat bahawa kami boleh menggunakan nilai yang diterima daripada pengguna mengikut budi bicara kami. Mari tambahkan beberapa butiran lagi pada kod kami:
System.out.println("Please enter your last name");

String lastName=scan.next();

System.out.println("Your Name " + name + " " + "Your Last Name" + lastName);
Pada asasnya, kami mengulangi dua baris sebelumnya, meminta pengguna untuk nilai dan menyimpannya. Sekarang dalam baris terakhir kami menggunakan dua nilai yang kami ambil daripada pengguna dan yang kini digunakan bersama.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION