Kelas utas mewakili variabel lokal utas. Dengan menempatkan data di ThreadLocal, setiap utas dapat membuat salinan variabel. Ini juga dapat dianggap sebagai cara lain dari sinkronisasi utas. Dengan membuat salinan thread-lokal dari variabel untuk setiap utas, ia menghindari konflik ketika utas bersamaan membaca dan menulis sumber daya variabel yang sama secara bersamaan.
Contohnya adalah sebagai berikut:
impor java.util.random; impor java.util.concurrent.executorservice; impor java.util.concurrent.executors; impor java.util.concurrent.timeunit; com.sun.javafx.webkit.accessor; kelas publik Threadlocal <integer> value = new ThreadLocal <Integer> () {private acak acak = acak baru (); Integer InitialValue yang disinkronkan () {return random.nextInt (10000); }}; public static void increment () {value.set (value.get () + 1); } public static int get () {return value.get (); }} class static Accessor mengimplementasikan runnable {private final int id; public accessor (int id) {this.id = id; } @Override public void run () {while (! Thread.currentThread (). IsInterrupted ()) {threadLocalVariableHolder.increment (); System.out.println (ini); Thread.yield (); }} @Override Public String ToString () {return "#" + ID + ":" + ThreadLocalVariableHolder.get (); }} public static void main (string [] args) {executorService executorService = executors.newcachedThreadpool (); untuk (int i = 0; i <5; i ++) {executeService.execute (accessor baru (i)); } coba {timeunit.microseconds.sleep (1); } catch (InterruptedException e) {E.PrintStackTrace (); } ExecutorService.shutdownnow (); }}Hasil Menjalankan:
#1: 9685#1: 9686#2: 138#2: 139#2: 140#2: 141#0: 5255 .. .
Dari hasil berjalan, kita dapat melihat bahwa setiap utas digunakan untuk variabel lokal sendiri, dan masing -masing membaca dan menulis tidak saling mengganggu.
ThreadLocal menyediakan tiga metode untuk beroperasi, mengatur, mendapatkan, dan menghapus.
Di Android, ThreadLocal digunakan untuk membuat objek looper terpisah untuk setiap utas.
kelas akhir publik looper {private static final string tag = "looper"; // sthreadlocal.get () akan mengembalikan null kecuali Anda telah menelepon persiapan (). statis final threadlocal <looper> sthreadlocal = threadlocal baru <looper> (); private static void persiapan (boolean dibatalkan) {if (sthreadlocal.get ()! = null) {lempar runtimeException baru ("Hanya satu looper yang dapat dibuat per utas"); } sthreadlocal.set (looper baru (Quitallowed)); }. . . }Ketika sebuah utas membutuhkan looper dan antrian pesannya sendiri, ia memanggil looper.prepare (), yang akan membuat objek looper dan pesan milik utas untuk utas, dan menyimpan objek looper di threadlocal.