您的位置:首页 > 编程语言

【代码积累】ThreadLocal

2017-06-15 13:28 232 查看
public class Test {
public void test() {
ThreadId id = new ThreadId();

TaskFac fac = new TaskFac();
for( int i=0; i< 10; i++ ) {
fac.createTask().start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

public class Task implements Runnable{
private ThreadId id = new ThreadId();

@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Task ID ="+ThreadId.get());
}
}

import java.util.concurrent.atomic.AtomicInteger;

public class ThreadId {
private static final AtomicInteger nextId = new AtomicInteger(0); /*初始化为0,该值用来在每次被引用的时候,生成一个唯一的值*/

//Thread local variable containing each thread's ID
private static final ThreadLocal<Integer> threadId = new ThreadLocal<Integer>() {
protected Integer initialValue() {  /*initialValuez在基类中是protected,不能在子类覆盖的时候reduce visibility,因此也要加上protected*/
return nextId.getAndIncrement();
/*nextId 之所以要是static类型,因为有此static方法引用了它,static方法不能引用non-static的field。
* 这里之所以都定义成static类型,因为non-static本身就是线程安全的,而static是非线程安全的,这里是为了说明在多线程访问的场景下,
* ThreadLocal的作用。*/
}
};

public static int get() {
return threadId.get();
}
}

public class TaskFac {
public Thread createTask() {
return new Thread(new Task());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: