本文共 1272 字,大约阅读时间需要 4 分钟。
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 ThreadLocalthreadId = new ThreadLocal () { 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()); }}
转载地址:http://othii.baihongyu.com/