package com.bao.examples.concurrent;
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()
{
System.out.println("Called by: " + Thread.currentThread().getName());
return uniqueId.getAndIncrement();
}
};
public static int getCurrentThreadId()
{
return uniqueNum.get();
}
private static class TestThread extends Thread
{
private int prev = -1;
public void run()
{
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
// TODO: handle exception
}
for(int j = 0; j < 10; j++)
{
int curr = UniqueThreadIdGenerator.getCurrentThreadId();
if(prev != -1)
{
System.err.println("[FAIL]: curr=" + curr + ", prev=" + prev);
}
System.out.println(getName() + ": " + curr);
try
{
Thread.sleep(100);
}
catch(Exception e)
{
}
}
}
}
public static void main(String[] args)
{
int count = 10;
for(int i = 0; i < count; i++)
{
Thread t = new TestThread();
t.setName("T-" + i);
t.start();
}
}
} // UniqueThreadIdGenerator