Java 中ThreadLocal类详解

网友投稿 165 2023-07-19


Java 中ThreadLocal类详解

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 value = new ThreadLocal() {

private Random random = new Random();

protected synchronized Integer initialValue() {

returnhttp:// 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 (!ThretlBtRCbad.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 Thttp://AG = "Looper";

// sThreadLocal.get() will return null unless you've called prepare().

static final ThreadLocal sThreadLocal = new ThreadLocal();

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(http://quitAllowed));

}

。。。

}

当某个线程需要自己的Looper及消息队列时,就调用Looper.prepare(),它会为线程创建属于线程的Looper对象及MessageQueue,并将Looper对象保存在ThreadLocal中。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:android用java动态增添删除修改布局
下一篇:Java 线程池详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~