我正在进行互斥任务,但是当我开始时,我注意到我的应用程序的线程ID从9开始。当我再次编译并执行它时,它不会改变。是否存在一些我遗漏的问题,或者Java Thread ID是否可以以任意数字开头? This question是相关的。
对于那些感兴趣的人,这里有一个来自Herlihy& Shavit的编码线程的“多处理器编程的艺术”:
public class ThreadID {
private static volatile int nextID = 0;
private static class ThreadLocalID extends ThreadLocal<Integer> {
protected synchronized Integer initialValue() {
return nextID++;
}
}
private static ThreadLocalID threadID = new ThreadLocalID();
public static int get() {
return threadID.get();
}
public static void set(int index) {
threadID.set(index);
}
}
然后你可以打电话
ThreadID.get();
将自动递增数字并始终从1开始。
答案 0 :(得分:7)
来自Thread#getId()
文档:
返回此Thread的标识符。 线程ID是一个正长 此线程生成的数字 创建。线程ID是唯一的 在其生命周期内保持不变。 当一个线程被终止时,这个 线程ID可以重复使用。
没有任何迹象表明保证会从0开始。我猜想,在内部,Java会在您创建的第一个对象之前生成多个Thread对象,因此线程ID 0-8已经被占用。但是,文档中没有任何内容可以保证这个数字在任何方面都是顺序的(尽管这是当前实现的方式),所以你不应该依赖它。
答案 1 :(得分:2)
是。但是线程ID由整个JVM共享,因此对于您的应用程序,它可以从任何数字开始。
答案 2 :(得分:0)
我不知道是否有定义此规范的规范,或者这个编号的可靠性或一致性如何,但是您在代码中创建的线程不是系统中第一个运行的线程,多个线程在代码作为JVM的一部分运行之前启动。 这是我运行你的代码时jstack在我的jvm上运行的说法(在那里睡觉所以我可以测量):
"Attach Listener" daemon prio=10 tid=0x000000004038c400 nid=0x3adf runnable [0x0000000000000000..0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Low Memory Detector" daemon prio=10 tid=0x00007f7dc4002400 nid=0x3ac5 runnable [0x0000000000000000..0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"CompilerThread1" daemon prio=10 tid=0x0000000040386400 nid=0x3ac4 waiting on condition [0x0000000000000000..0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"CompilerThread0" daemon prio=10 tid=0x0000000040384000 nid=0x3ac3 waiting on condition [0x0000000000000000..0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=10 tid=0x0000000040382000 nid=0x3ac2 runnable [0x0000000000000000..0x0000000040c43710]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=10 tid=0x0000000040363000 nid=0x3ac1 in Object.wait() [0x0000000042186000..0x0000000042186a00]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00007f7dfaaa1210> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
- locked <0x00007f7dfaaa1210> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
"Reference Handler" daemon prio=10 tid=0x000000004035bc00 nid=0x3ac0 in Object.wait() [0x0000000042085000..0x0000000042085d80]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00007f7dfaaa1078> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x00007f7dfaaa1078> (a java.lang.ref.Reference$Lock)
"main" prio=10 tid=0x00000000402f5800 nid=0x3abc waiting on condition [0x0000000041015000..0x0000000041015ec0]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Simulation.main(Simulation.java:16)
"VM Thread" prio=10 tid=0x0000000040356400 nid=0x3abf runnable
"GC task thread#0 (ParallelGC)" prio=10 tid=0x0000000040300400 nid=0x3abd runnable
"GC task thread#1 (ParallelGC)" prio=10 tid=0x0000000040301c00 nid=0x3abe runnable
"VM Periodic Task Thread" prio=10 tid=0x00007f7dc4004c00 nid=0x3ac6 waiting on condition
答案 3 :(得分:0)
线程ID是创建此线程时生成的正长数。线程ID是唯一的,并且在其生命周期内保持不变。当线程终止时,可以重用该线程ID。
参考:http://java.sun.com/javase/6/docs/api/java/lang/Thread.html
它不需要从0或任何其他数字开始。