国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java 中ThreadLocal類詳解

2019-11-26 14:28:36
字體:
來源:轉載
供稿:網友

ThreadLocal類,代表一個線程局部變量,通過把數據放在ThreadLocal中,可以讓每個線程創建一個該變量的副本。也可以看成是線程同步的另一種方式吧,通過為每個線程創建一個變量的線程本地副本,從而避免并發線程同時讀寫同一個變量資源時的沖突。

示例如下:

import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import com.sun.javafx.webkit.Accessor;public class ThreadLocalTest { static class ThreadLocalVariableHolder {  private static ThreadLocal<Integer> value = new ThreadLocal<Integer>() {   private Random random = new Random();      protected synchronized Integer initialValue() {    return random.nextInt(10000);   }  };    public static void increment() {   value.set(value.get() + 1);  }    public static int get() {   return value.get();  } }  static class Accessor implements 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(this);    Thread.yield();   }  }    @Override  public String toString() {   return "#" + id + ": " + ThreadLocalVariableHolder.get();  }   }  public static void main(String[] args) {  ExecutorService executorService = Executors.newCachedThreadPool();  for (int i = 0; i < 5; i++) {   executorService.execute(new Accessor(i));  }  try {   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。。。

由運行結果可知,各線程都用于各自的Local變量,并各自讀寫互不干擾。

ThreadLocal共提供了三個方法來操作,set,get和remove。

在Android 中的Looper,即使用了ThreadLocal來為每個線程都創建各自獨立的Looper對象。

public final class Looper { private static final String TAG = "Looper"; // sThreadLocal.get() will return null unless you've called prepare(). static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>(); private static void prepare(boolean quitAllowed) {  if (sThreadLocal.get() != null) {   throw new RuntimeException("Only one Looper may be created per thread");  }  sThreadLocal.set(new Looper(quitAllowed)); }  。。。}

當某個線程需要自己的Looper及消息隊列時,就調用Looper.prepare(),它會為線程創建屬于線程的Looper對象及MessageQueue,并將Looper對象保存在ThreadLocal中。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贡觉县| 志丹县| 会昌县| 伊金霍洛旗| 顺昌县| 宁阳县| 连城县| 祁东县| 沧源| 栾川县| 二连浩特市| 墨竹工卡县| 六枝特区| 丽江市| 四会市| 安义县| 莎车县| 广西| 黄石市| 晴隆县| 洛浦县| 塔河县| 土默特左旗| 乐东| 镇江市| 崇阳县| 东源县| 板桥市| 阳春市| 福海县| 怀柔区| 集贤县| 顺义区| 博乐市| 衡阳县| 安塞县| 绥棱县| 成都市| 承德市| 罗平县| 牡丹江市|