Я изучаю многопоточность в java.My сомневаюсь, есть ли способ, чтобы два идентифицировали два разных потока, если они имеют одно и то же имя ниже, это мой код
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[main,5,main]
Thread[ram,5,main]
Thread[ram,5,main]
Я знаю, что у них два разных потока, имеющих одинаковое имя, поэтому как узнать, что они разные, не меняя имени?
Хорошо, что вы можете отслеживать Threads
с тем же именем по их ID
который будет уникальным.
Каждый поток имеет имя для идентификации. У более чем одного потока может быть одно и то же имя. Если имя не указано при создании потока, для него создается новое имя.
JVM
отслеживает потоки по их ID
, а не по имени.
long threadId = Thread.currentThread().getId();
Вы не должны использовать имя потока, чтобы идентифицировать уникальный поток. Класс Thread
имеет метод getId()
который возвращает long
число, сгенерированное при создании потока и уникальное для потока. Используйте это, чтобы узнать, отличаются ли они.
Ваш примерный код совершенно странный.
Thread
- очень редкие случаи, когда это необходимо.Thread
получает свое имя от кода, который его создает. Это позволяет легко дать каждому новому потоку другое отличное имя. Не указывайте имя в методе run
.static
конструкторе класса.Вероятно, ваш пример должен выглядеть следующим образом:
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());
}
}
Вы можете просто сравнить два объекта Test11 и Test12 (т.е. потоки) с помощью оператора equals.
Использование метода getId
Используйте метод getId для идентификации уникальности Thread.
Идентификатор потока должен быть установлен при создании нового потока. Независимо от конструктора, который будет использоваться.
Thread() Thread(Runnable, String) Thread(Runnable) Thread(String) Thread(ThreadGroup, Runnable, String, long) Thread(ThreadGroup, Runnable, String) Thread(ThreadGroup, Runnable) Thread(ThreadGroup, String)
все конструкторы использовали метод init. В этом методе есть генерация потоков.
Также в методе clone также есть генерация потоков.
Если Thread клонируется, новый идентификатор потока устанавливается для новой ссылки на поток.
Использование метода equals & Hashcode
Другой способ идентифицировать уникальность потоков - использовать equals и hashcode.
Thread doesnt имеет одинаковые методы equals и hascode.
Таким образом, используя hashcode для дифференциации уникальности потоков.
getId()
также может быть полезным!ThreadIds
будут разными.