คลาส ThreadLocal แสดงถึงตัวแปรเธรดท้องถิ่น โดยการวางข้อมูลใน ThreadLocal แต่ละเธรดสามารถสร้างสำเนาของตัวแปร นอกจากนี้ยังสามารถถือได้ว่าเป็นอีกวิธีหนึ่งของการซิงโครไนซ์เธรด โดยการสร้างสำเนาเธรดท้องถิ่นของตัวแปรสำหรับแต่ละเธรดจะหลีกเลี่ยงความขัดแย้งเมื่อเธรดพร้อมกันอ่านและเขียนทรัพยากรตัวแปรเดียวกันในเวลาเดียวกัน
ตัวอย่างมีดังนี้:
นำเข้า java.util.random; นำเข้า java.util.concurrent.executorservice; นำเข้า java.util.concurrent.executors; นำเข้า java.util.concurrent.timeunit; นำเข้า com.sun.javafx.webkit.accessor; ThreadLocal <Integer> value = new ThreadLocal <integer> () {สุ่มส่วนตัวสุ่ม = ใหม่สุ่ม (); ได้รับการป้องกันการซิงโครไนซ์จำนวนเต็ม initialValue () {return random.nextint (10,000); - การเพิ่มขึ้นของโมฆะแบบคงที่สาธารณะ () {value.set (value.get () + 1); } สาธารณะคงที่ int get () {return value.get (); }} accessor คลาสแบบคงที่ใช้งาน Runnable {ID int สุดท้ายส่วนตัว; Public Accessor (int id) {this.id = id; } @Override โมฆะสาธารณะ Run () {ในขณะที่ (! thread.currentthread (). isInterrupted ()) {threadlocalVariableHolder.increment (); System.out.println (นี่); Thread.yield (); }} @Override สตริงสาธารณะ toString () {return "#" + id + ":" + threadLocalVariableHolder.get (); }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ExecutoRservice ExecutorService = Executors.newCachedThreadPool (); สำหรับ (int i = 0; i <5; i ++) {executeservice.execute (accessor ใหม่ (i)); } ลอง {timeunit.microseconds.sleep (1); } catch (interruptedException e) {e.printStackTrace (); } ExecutorService.shutdownnow (); -ผลการทำงาน:
#1: 9685#1: 9686#2: 138#2: 139#2: 140#2: 141#0: 5255. -
จากผลการทำงานเราจะเห็นว่าแต่ละเธรดใช้สำหรับตัวแปรท้องถิ่นของตัวเองและการอ่านและการเขียนแต่ละรายการจะไม่รบกวนกันและกัน
ThreadLocal มีวิธีการสามวิธีในการใช้งานตั้งค่ารับและลบ
ใน Android ThreadLocal ใช้เพื่อสร้างวัตถุ looper แยกต่างหากสำหรับแต่ละเธรด
Public Final Class Looper {สตริงสตริงสุดท้ายคงที่ = "looper"; // sthreadlocal.get () จะส่งคืนค่า null เว้นแต่คุณจะเรียกว่าเตรียม () Static Final ThreadLocal <Looper> sthreadLocal = new ThreadLocal <Looper> (); โมฆะคงที่ส่วนตัวเตรียม (บูลีนเลิกใช้) {ถ้า (sthreadlocal.get ()! = null) {โยน runtimeException ใหม่ ("อาจสร้าง looper เพียงหนึ่งตัวต่อเธรด"); } sthreadlocal.set (ใหม่ looper (quitallowed)); - - - -เมื่อเธรดต้องการ Looper และคิวข้อความของตัวเองมันจะเรียก looper.pare () ซึ่งจะสร้างวัตถุ looper และ messagequeue ที่เป็นของเธรดสำหรับเธรดและบันทึกวัตถุ looper ใน ThreadLocal