Java 识别两个不同的线程
我正在学习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
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
将不同。注意:当查看控制台输出时。注意:当查看控制台输出时。