```java
import java.util.concurrent.atomic.AtomicInteger;
public class UniqueThreadIdGenerator {
private static final AtomicInteger uniqueId = new AtomicInteger(0);
private static final ThreadLocal<Integer> uniqueNum =
new ThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return uniqueId.getAndIncrement(); //为 uniqueNum 每个线程中的初始化赋不同的初值
}
};
public static int getCurrentThreadId() {
//不同的线程调用到ThreadLocal变量时,会为每个线程只做一次引用拷贝
return uniqueNum.get();
}
private static class TestThread extends Thread {
private int id;
public TestThread(int id) {
this.id = id;
}
@Override
public void run() {
super.run();
int n = 10;
while (n-- > -1) {
System.out.println("Id:" + String.valueOf(id) + " value:" + uniqueNum.get());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (id == 2 && n == 5) {
//set只修改当前线程独有的变量,此处修改后当前线程中的 uniqueNum 和 uniqueId 没有任何关联
//uniqueNum 和 uniqueId 的唯一关系也就是初始化 uniqueNum 的值
uniqueNum.set(1000);
}
}
}
}
public static void main(String[] args) {
System.out.println("ThreadId:" + Thread.currentThread().getId());
System.out.println("Id:" + UniqueThreadIdGenerator.getCurrentThreadId());
System.out.println("Id:" + UniqueThreadIdGenerator.getCurrentThreadId());
Thread t0 = new Thread() {
@Override
public void run() {
super.run();
System.out.println("ThreadId:" + Thread.currentThread().getId());
System.out.println("new Thread ,Id:" + UniqueThreadIdGenerator.getCurrentThreadId());
}
};
t0.start();
try {
t0.join();
Thread t1 = new TestThread(1);
Thread t2 = new TestThread(2);
Thread t3 = new TestThread(3);
t1.start();
t2.start();
t1.join();
t2.join();
t3.start();
t3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} // UniqueThreadIdGenerator