Java ThreadLocal<;T>;JDK中的文档
JDK1.6文档展示了一个关于如何使用Java ThreadLocal<;T>;JDK中的文档,java,multithreading,thread-local-storage,Java,Multithreading,Thread Local Storage,JDK1.6文档展示了一个关于如何使用LocalThread的示例。我复制并粘贴到这里: 例如,下面的类生成每个线程本地的唯一标识符。线程的id在第一次调用UniqueThreadIdGenerator.getCurrentThreadId()时被分配,并且在后续调用时保持不变 import java.util.concurrent.atomic.AtomicInteger; public class UniqueThreadIdGenerator { private
LocalThread
的示例。我复制并粘贴到这里:
例如,下面的类生成每个线程本地的唯一标识符。线程的id在第一次调用UniqueThreadIdGenerator.getCurrentThreadId()
时被分配,并且在后续调用时保持不变
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();
}
};
public static int getCurrentThreadId() {
return uniqueId.get();
}
} // UniqueThreadIdGenerator
现在在第一次调用之后,它开始初始化变量。是的,它应该是
uniqueNum.get()
。选择正确的名称,并使用更好的名称:
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadId {
// Atomic integer containing the next thread ID to be assigned
private static final AtomicInteger nextId = new AtomicInteger(0);
// Thread local variable containing each thread's ID
private static final ThreadLocal<Integer> threadId =
new ThreadLocal<Integer>() {
@Override protected Integer initialValue() {
return nextId.getAndIncrement();
}
};
// Returns the current thread's unique ID, assigning it if necessary
public static int get() {
return threadId.get();
}
}
导入java.util.concurrent.AtomicInteger;
公共类线程ID{
//包含要分配的下一个线程ID的原子整数
私有静态最终AtomicInteger nextId=新的AtomicInteger(0);
//包含每个线程ID的线程局部变量
私有静态最终ThreadLocal threadId=
新ThreadLocal(){
@重写受保护的整数初始值(){
返回nextId.getAndIncrement();
}
};
//返回当前线程的唯一ID,必要时分配它
公共静态int get(){
返回threadId.get();
}
}
但这并不是一个真正的初始化问题——这只是一个完全使用错误成员的问题。即使许多代码在原始代码中使用了
uniqueNum
,getCurrentThreadId()
也会始终返回“要分配的下一个ID”,而不是“为当前线程分配的ID”。是的,它应该是uniqueNum.get()
。选择正确的名称,并使用更好的名称:
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadId {
// Atomic integer containing the next thread ID to be assigned
private static final AtomicInteger nextId = new AtomicInteger(0);
// Thread local variable containing each thread's ID
private static final ThreadLocal<Integer> threadId =
new ThreadLocal<Integer>() {
@Override protected Integer initialValue() {
return nextId.getAndIncrement();
}
};
// Returns the current thread's unique ID, assigning it if necessary
public static int get() {
return threadId.get();
}
}
导入java.util.concurrent.AtomicInteger;
公共类线程ID{
//包含要分配的下一个线程ID的原子整数
私有静态最终AtomicInteger nextId=新的AtomicInteger(0);
//包含每个线程ID的线程局部变量
私有静态最终ThreadLocal threadId=
新ThreadLocal(){
@重写受保护的整数初始值(){
返回nextId.getAndIncrement();
}
};
//返回当前线程的唯一ID,必要时分配它
公共静态int get(){
返回threadId.get();
}
}
但这并不是一个真正的初始化问题——这只是一个完全使用错误成员的问题。即使许多代码在原始代码中使用了
uniqueNum
,getCurrentThreadId()
也会始终返回“要分配的下一个ID”,而不是“为当前线程分配的ID”。您可以使用每个线程已经拥有的唯一ID,而不是生成唯一的ID<代码>长id=Thread.currentThread().getId()您可以使用每个线程已经拥有的唯一id,而不是生成唯一id<代码>长id=Thread.currentThread().getId()也许还应该重写ThreadLocal的set
和remove
方法并抛出一个。只是一个想法。也许还应该覆盖ThreadLocal的set
和remove
方法并抛出一个。只是一个想法。