Java 识别两个不同的线程

Java 识别两个不同的线程,java,multithreading,Java,Multithreading,我正在学习java中的多线程。我的疑问是,如果两个线程具有相同的名称,是否有任何方法可以识别两个不同的线程。下面是我的代码 package com.rajeev.test2; public class Test11 extends Thread { public static void main(String[] args) { System.out.println(Thread.currentThread()); new

我正在学习java中的多线程。我的疑问是,如果两个线程具有相同的名称,是否有任何方法可以识别两个不同的线程。下面是我的代码

package com.rajeev.test2;

    public class Test11 extends Thread {
        public static void main(String[] args) {
            System.out.println(Thread.currentThread());
            new Test11().start();
            new Test12();
        }
        @Override
        public void run() {
            Thread.currentThread().setName("ram");
            System.out.println(Thread.currentThread());
        }
    }
    class Test12 extends Thread{

        static{
            new Test12().start();
        }
        @Override
        public void run() {
            Thread.currentThread().setName("ram");
            System.out.println(Thread.currentThread());
        }
    }
输出
我知道它们是两个具有相同名称的不同线程,因此如何在不更改名称的情况下知道它们是不同的线程?

您不应该使用线程的名称来标识唯一的线程。
Thread
类有一个
getId()
方法,该方法返回创建线程时生成的
long
编号,该编号对于线程是唯一的。使用此选项可了解它们是否不同。

不应使用线程名称来标识唯一的线程。
Thread
类有一个
getId()
方法,该方法返回创建线程时生成的
long
编号,该编号对于线程是唯一的。使用此选项可以知道它们是否不同。

您可以通过其唯一的
ID来跟踪具有相同名称的
线程

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

JVM
通过线程的
ID
而不是名称跟踪线程

long threadId = Thread.currentThread().getId();

您可以通过其
ID
跟踪具有相同名称的
线程,该ID将是唯一的

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

JVM
通过线程的
ID
而不是名称跟踪线程

long threadId = Thread.currentThread().getId();

使用getId方法

使用getId标识线程的唯一性

创建新线程时要设置线程id。不考虑将使用的构造函数

Thread()
线程(可运行,字符串)
线程(可运行)
线程(字符串)
线程(线程组、可运行、字符串、长)
线程(线程组、可运行、字符串)
线程(线程组,可运行)
线程(线程组、字符串)

所有构造函数都使用init方法。在此方法中有线程id生成

同样在克隆方法中也有线程id生成

如果克隆了线程,则为新线程引用设置新线程id

使用equals&Hashcode方法

另一种识别线程唯一性的方法是使用equals和hashcode

线程没有相同的equals和hascode方法


因此,使用hashcode来区分线程的唯一性。

使用getId方法

使用getId标识线程的唯一性

创建新线程时要设置线程id。不考虑将使用的构造函数

Thread()
线程(可运行,字符串)
线程(可运行)
线程(字符串)
线程(线程组、可运行、字符串、长)
线程(线程组、可运行、字符串)
线程(线程组,可运行)
线程(线程组、字符串)

所有构造函数都使用init方法。在此方法中有线程id生成

同样在克隆方法中也有线程id生成

如果克隆了线程,则为新线程引用设置新线程id

使用equals&Hashcode方法

另一种识别线程唯一性的方法是使用equals和hashcode

线程没有相同的equals和hascode方法


因此,使用hashcode来区分线程的唯一性。

您可以使用equals操作符简单地比较Test11和Test12的两个对象(即线程)。

您可以使用equals操作符简单地比较Test11和Test12的两个对象(即线程)。

您的示例代码完全奇怪

  • 决不要将
    线程子类化
    ——在极少数情况下需要这样做
  • 通常,
    线程
    的名称来自创建它的代码。这使得给每个新线程另一个不同的名称变得很容易。不要在
    run
    方法中设置名称
  • 请不要在类的
    静态
    构造函数中启动线程
也许你的例子也应该如此:

public class ThreadExample {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread());
        new Thread(new PrintThreadNameTask(), "thread-1").start();
        new Thread(new PrintThreadNameTask(), "thread-2").start();
    }
}

class PrintThreadNameTask implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread());
    }
}

您的示例代码非常奇怪

  • 决不要将
    线程子类化
    ——在极少数情况下需要这样做
  • 通常,
    线程
    的名称来自创建它的代码。这使得给每个新线程另一个不同的名称变得很容易。不要在
    run
    方法中设置名称
  • 请不要在类的
    静态
    构造函数中启动线程
也许你的例子也应该如此:

public class ThreadExample {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread());
        new Thread(new PrintThreadNameTask(), "thread-1").start();
        new Thread(new PrintThreadNameTask(), "thread-2").start();
    }
}

class PrintThreadNameTask implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread());
    }
}

也可以是有用的!就像@nincompop所说的-两个线程可以有相同的名称,但是它们的
threadid
将不同。也可以是有用的!就像@nincompop所说的-两个线程可以有相同的名称,但它们的
threadid
将不同。注意:当查看控制台输出时。注意:当查看控制台输出时。