Java Thread ID总是应该从0开始吗?

pyp*_*ies 4 java multithreading numbers

我正在进行互斥任务,但是当我开始时,我注意到我的应用程序的线程ID从9开始.当我再次编译并执行它时,它不会改变.是否存在一些我遗漏的问题,或者Java Thread ID是否可以以任意数字开头?这个问题是相关的.


对于那些感兴趣的人,这里有一个来自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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以打电话

ThreadID.get();
Run Code Online (Sandbox Code Playgroud)

这将自动增加数字,并始终从1开始.

Joh*_*eek 7

Thread#getId()文档:

返回此Thread的标识符.线程ID是创建此线程时生成的正长数.线程ID是唯一的,并且在其生命周期内保持不变.当线程终止时,可以重用该线程ID.

没有任何迹象表明保证从0开始.我猜想,在内部,Java会在您创建的第一个对象之前生成多个Thread对象,因此线程ID 0-8已经被占用.但是,文档中没有任何内容可以保证此数字将以任何方式顺序排列(尽管这是当前实现的方式),因此您不应该依赖于此.