JavaRush /Java Blog /Random-TL /Coffee break #160. Malalim na sumisid sa Java ThreadLocal...

Coffee break #160. Malalim na sumisid sa Java ThreadLocal. Klase ng scanner sa Java

Nai-publish sa grupo

Deep Dive sa Java ThreadLocal

Source: Devgenios Ngayon ay matututunan mo ang tungkol sa ThreadLocal, isa sa mga karaniwang klase na ginagamit sa pagbuo ng mga application ng Java. Coffee break #160.  Malalim na sumisid sa Java ThreadLocal.  Klase ng scanner sa Java - 1

Ano ang ThreadLocal?

Ang ThreadLocal class ay nag-iimbak ng mga lokal na variable para sa mga thread. Ang mga variable na ito ay nakahiwalay sa pagitan ng iba't ibang mga thread at maaari lamang ma-access ng kanilang sariling thread. Gamitin ang mga kaso para sa ThreadLocal :
  1. Ihiwalay ang data sa pagitan ng mga thread.
  2. Pamamahala ng session para sa mga koneksyon sa database.
  3. Pag-iimbak ng impormasyon ng transaksyon sa thread.

Paano gamitin ang ThreadLocal?

Tingnan natin ang isang simpleng halimbawa.
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());
}
Sa code sa itaas, gumawa kami ng ThreadLocal class , gumawa ng 5 thread, magtalaga ng value sa ThreadLocal sa bawat thread at mag-print. Kapag nag-output, nakukuha namin ang: Coffee break #160.  Malalim na sumisid sa Java ThreadLocal.  Klase ng scanner sa Java - 2

Ano ang nasa ilalim ng talukbong?

Kung titingnan mong mabuti, makikita mo na mayroong dalawang mahalagang pamamaraan sa ThreadLocal mula sa halimbawa ng code na ito.
  • pampublikong T get() {}

  • pampublikong void set (T value) {}

Tingnan natin ang setter method sa ThreadLocal source code :
public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
}
Nakukuha muna ng setter method ang kasalukuyang thread at tinatawag ang getMap() method para makuha ang ThreadLocalMap class . Kung umiiral ang mapa , kunin ang kasalukuyang stream t bilang susi, ang parameter ng input bilang halaga, at itakda ang pares na {key:value} sa mapa. Kung hindi, pagkatapos ay lumikha ng isang mapa . Ngayon ay maaari kang may tanong - ano ang 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;
       }
    }
}
Ang ThreadLocalMap ay isang panloob na static na klase sa ThreadLocal na tumutukoy sa isang Entry class upang mag-imbak ng data. Ginagamit ng entry ang ThreadLocal instance bilang susi at itinatakda ang value na ipinapasa namin. Kung ito ay masyadong nakakalito sa puntong ito, tandaan lamang na ang Entry class sa ThreadLocalMap ang gumagawa ng aktwal na pag-iimbak ng mga halaga. Upang makakuha ng data mula sa ThreadLocal ginagamit namin ang getter method :
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();
}
Sa paraan ng getter , gagamitin namin ang currentThread bilang susi upang makuha ang ThreadLocalMap . Pagkatapos ang mapa ay getEntry() batay sa ThreadLocal instance at ibabalik ang Entry instance at pagkatapos ay ang stored value. Narito ang isang diagram upang matulungan kang malaman ito: Coffee break #160.  Malalim na sumisid sa Java ThreadLocal.  Klase ng scanner sa Java - 3Coffee break #160.  Malalim na sumisid sa Java ThreadLocal.  Klase ng scanner sa Java - 4
  1. Ang bawat thread ay nagpapanatili ng isang reference sa isang ThreadLocalMap .

  2. Ang ThreadLocalMap ay isang panloob na static na klase ng ThreadLocal at ginagamit ang Entry class para sa storage.

  3. Ang ThreadLocalMap key ay isang instance ng ThreadLocal at maaaring magkaroon ng maramihang ThreadLocals .

  4. Ang ThreadLocal mismo ay hindi nag-iimbak ng isang halaga, ngunit ito ay isang susi para sa thread na makakatulong na makuha ang halaga mula sa ThreadLocalMap .

Tandaan na mas mabuting tanggalin ang ThreadLocal para maiwasan ang OOM (Out-of-Memory Error) dahil sa isang "mahina" na reference sa Entry class .

Klase ng scanner sa Java

Source: Medium Tutulungan ka ng post na ito na maging pamilyar sa klase ng Scanner sa Java. Coffee break #160.  Malalim na sumisid sa Java ThreadLocal.  Klase ng scanner sa Java - 5Ang Scanner class sa Java ay isang klase na ginagamit namin kapag gusto naming makakuha ng value mula sa user. Ang pinakamadaling paraan upang maunawaan ito ay may mga halimbawa, kaya tingnan natin ito nang mas malinaw. Ang paggawa ng klase ng Scanner ay isa sa tatlong hakbang na ginagawa namin para makakuha ng value mula sa user. Ang unang hakbang ay lumikha ng isang bagay mula sa klase ng scanner.
Scanner scan=new Scanner(System.in);
Ngayon ay mayroon na tayong scanner object. Ang bagay na ito ay magkakaroon ng mga katangian ng Scanner mula sa klase ng Scanner . Pagkatapos ng unang hakbang, mailalagay na ng user ang nais na halaga, ngunit kung hindi namin gagabayan ang user at ipapakita ang halaga sa console o sa application, hindi ito magiging napakahusay sa mga tuntunin ng kakayahang magamit. Samakatuwid, mas mahusay na ipaalam at gabayan ang gumagamit:
System.out.println("Please enter your name");
String name=scan.next();
System.out.println("Your Name:"+name);
Sa unang linya tinanong namin ang gumagamit kung ano ang gusto namin mula sa kanya. Ito ay talagang walang kinalaman sa scanner, ngunit palaging magandang magbigay ng mga pahiwatig sa iyong mga user. Sa pangalawang linya ay itatalaga namin ang halaga na ipinasok ng user sa data at i-save ito upang magamit namin ito sa ibang pagkakataon. Sa huling linya nakita namin na magagamit namin ang halaga na natanggap mula sa user ayon sa aming pagpapasya. Magdagdag tayo ng ilan pang detalye sa ating code:
System.out.println("Please enter your last name");

String lastName=scan.next();

System.out.println("Your Name " + name + " " + "Your Last Name" + lastName);
Karaniwan, inulit namin ang nakaraang dalawang linya, tinanong ang user para sa halaga at na-save ito. Ngayon sa huling linya ginamit namin ang dalawang halaga na kinuha namin mula sa gumagamit at na ngayon ay ginagamit nang magkasama.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION