threadlocalクラスは、スレッドローカル変数を表します。データをthreadlocalに配置することにより、各スレッドは変数のコピーを作成できます。また、スレッドの同期の別の方法と見なすこともできます。各スレッドの変数のスレッドローカルコピーを作成することにより、同時スレッドが同じ変数リソースを同時に読み取り、書き込むと、競合を回避します。
例は次のとおりです。
java.util.randomをインポート;インポートjava.util.concurrent.executorservice;インポートjava.util.concurrent.executors; Import java.util.concurrent.timeunit; Import com.sun.javafx.webkit.acces threadlocal <integer> value = new SthreadLocal <Integer>(){private random = new Random();保護された同期整数initialValue(){return random.nextint(10000); }}; public static void increment(){value.set(value.get() + 1); } public static int get(){return value.get(); }} staticクラスアクセターは実行可能{プライベートファイナルint id;パブリックアクセサ(int id){this.id = id; } @Override public void run(){while(!thread.currentthread()。is interrupted()){swreplocalvariableholder.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 ++){executeservice.execute(new Accessor(i)); } try {timeunit.microseconds.sleep(1); } catch(arturnedexception e){e.printstacktrace(); } executorservice.shutdownnow(); }}実行結果:
#1:9685#1:9686#2:138#2:139#2:140#2:141#0:5255。 。
実行中の結果から、各スレッドは独自のローカル変数に使用されており、それぞれの読み取りと書き込みが互いに干渉しないことがわかります。
ThreadLocalは、操作、設定、取得、削除を行う3つの方法を提供します。
Androidでは、ThreadLocalを使用して、各スレッドの個別のルーパーオブジェクトを作成します。
パブリックファイナルクラスルーパー{private static final string tag = "looper"; // sthreadlocal.get()は、prepare()を呼び出しない限り、nullを返します。静的最終ThreadLocal <Looper> sthreadLocal = new ThreadLocal <Looper>(); private static void prepare(boolean quitallowed){if(sthreadlocal.get()!= null){throw new runtimeexception( "スレッドごとに1つのルーパーのみを作成できます"); } sthreadLocal.set(new Looper(quitallowed)); }。 。 。 }スレッドが独自のルーパーとメッセージキューを必要とする場合、looper.prepare()を呼び出します。これは、スレッドのスレッドに属するルーパーオブジェクトとメッセージを作成し、threadlocalにルーパーオブジェクトを保存します。