Выявление двух разных потоков

1

Я изучаю многопоточность в 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]

Я знаю, что у них два разных потока, имеющих одинаковое имя, поэтому как узнать, что они разные, не меняя имени?

  • 3
    getId() также может быть полезным!
  • 1
    Как говорит @NINCOMPOOP: два потока могут иметь одинаковые имена, но их ThreadIds будут разными.
Теги:
multithreading

5 ответов

5
Лучший ответ

Хорошо, что вы можете отслеживать Threads с тем же именем по их ID который будет уникальным.

Каждый поток имеет имя для идентификации. У более чем одного потока может быть одно и то же имя. Если имя не указано при создании потока, для него создается новое имя.

JVM отслеживает потоки по их ID, а не по имени.

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

Вы не должны использовать имя потока, чтобы идентифицировать уникальный поток. Класс Thread имеет метод getId() который возвращает long число, сгенерированное при создании потока и уникальное для потока. Используйте это, чтобы узнать, отличаются ли они.

0

Ваш примерный код совершенно странный.

  • Никогда не подкласса 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());
    }
}
0

Вы можете просто сравнить два объекта Test11 и Test12 (т.е. потоки) с помощью оператора equals.

0

Использование метода 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 для дифференциации уникальности потоков.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню