【问题标题】:Can Java understand that threads which have same name are different threads?Java 可以理解同名的线程是不同的线程吗?
【发布时间】:2023-03-06 15:46:01
【问题描述】:

在每次迭代中,都会创建一个线程“学生”。因为这些线程都被命名为“学生”。 Java 能理解这些是不同的线程吗?

while (true) {
    System.out.println("Waiting for client...");
    // open client socket to accept connection
    client = server.accept();
    System.out.println(client.getInetAddress()+" contacted ");
    System.out.println("Creating thread to serve request");

    ServerStudentThread student = new ServerStudentThread(client);
    student.start();
}

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    来自Javadoc

    每个线程都有一个用于识别目的的名称。 可能有多个线程具有相同的名称。如果创建线程时没有指定名称,则会为其生成一个新名称。

    JVM 通过 ID 而非名称来跟踪线程。

    【讨论】:

    • @skaffman,JVM 通过 ID 而非名称来跟踪线程 这完全不正确!你的意思是如果你覆盖 getId() 并且 java 确实搞砸了? Java 通过引用而不是 id(和一些本机代码双射)跟踪线程
    • @bestsss 我相信 skaffman 指的是由本机线程实现分配的 id,并且 getId() 方法不是最终的,因此不太可能选择。
    • @josefx:就是这样。看看如果你覆盖 getId() 会发生什么会很有趣。
    • @skaffman,绝对没有任何反应,或者几乎[如果你重写 getId(),一些设计不佳的系统可能会被“黑客”这样做,因为它们识别通过 ids 管理线程,而不是weakRef; ReadWriteLock 可能会被混淆,因为它通过 id 记住最后一个线程,尝试优化]; Hotspot 使用 FS(或者是 GS?,总是忘记)寄存器(在 x86 上)指向本地线程结构,因此 Thread.localThread 在几个(6?)cpu 时钟内执行,它与操作系统句柄无关分配给线程。
    • @skaffman,我认为eetop 用于将句柄存储在热点中,但我查看代码已经好几年了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2012-11-22
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多