package javalearning;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class ThreadLocalDemo {
/*定义了1个ThreadLocal<Integer>对象,
*并复写它的initialValue方法,初始值是3*/
private ThreadLocal<Integer> tlA = new ThreadLocal<Integer>(){
protected Integer initialValue(){
return 3;
}
}
;
/*
private ThreadLocal<Integer> tlB = new ThreadLocal<Integer>(){
protected Integer initialValue(){
return 5;
}
};
*/
/*设置一个信号量,许可数为1,让三个线程顺序执行*/
Semaphore semaphore = new Semaphore(1);
private Random rnd = new Random();
/*Worker定义为内部类实现了Runnable接口,tlA定义在外部类中,
每个线程中调用这个对象的get方法,再调用一个set方法设置一个随机值*/
public class Worker implements Runnable{
@Override
public void run(){
try {
Thread.sleep(rnd.nextint(1000));
/*随机延时1s以内的时间*/
semaphore.acquire();
/*获取许可*/
}
catch (InterruptedException e) {
e.printStackTrace();
}
int valA = tlA.get();
System.out.println(Thread.currentThread().getName() +" tlA initial val : "+ valA);
valA = rnd.nextint();
tlA.set(valA);
System.out.println(Thread.currentThread().getName() +" tlA new val: "+ valA);
/*
int valB = tlB.get();
System.out.println(Thread.currentThread().getName() +" tlB initial val : "+ valB);
valB = rnd.nextInt();
tlA.set(valB);
System.out.println(Thread.currentThread().getName() +" tlB 2 new val: "+ valB);
*/
semaphore.release();
/*在线程池中,当线程退出之前一定要记得调用remove方法,因为在线程池中的线程对象是循环使用的*/
tlA.remove();
/*tlB.remove();*/
}
}
/*创建三个线程,每个线程都会对ThreadLocal对象tlA进行操作*/
public static void main(String[] args){
ExecutorService es = Executors.newFixedThreadPool(3);
ThreadLocalDemo tld = new ThreadLocalDemo();
es.execute(tld.new Worker());
es.execute(tld.new Worker());
es.execute(tld.new Worker());
es.shutdown();
}
}
pool-1-thread-1 tlA initial val : 3 pool-1-thread-1 tlA new val: -1288455998 pool-1-thread-3 tlA initial val : 3 pool-1-thread-3 tlA new val: 112537197 pool-1-thread-2 tlA initial val : 3 pool-1-thread-2 tlA new val: -12271334
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);//这里的this是指当前的ThreadLocal对象
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有