Java Многопоточность: все мои темы получают одинаковый идентификатор потока - PullRequest
1 голос
/ 01 апреля 2020

Мне нужно использовать многопоточность для проекта в моем классе программирования, чтобы на практике и посмотреть, как это работает, я использовал код, представленный в классе. Однако когда я запускаю код, все потоки имеют одинаковый идентификатор, это из-за моей системы или по другой причине?

Это код:

MyThread. java:

public class MyThread implements Runnable {
    public void run() {
        try{
            System.out.println("Thread id: " + Thread.currentThread().getId());
            for(int i = 0; i <= 10; i++){
                System.out.println(i);
            }
        }
        catch (Exception e){
            System.out.println(e.getCause().toString());
            return;
        }
    }
}

Приложение. java:

public class App {
    public static void main(String[] args) {
        MyThread [] threads = new MyThread[3];

        for(int i = 0; i < 3; i++){
            threads[i] = new MyThread();
        }
        for(int i = 0; i < 3; i++){
            threads[i].run();
        }
    }
}

1 Ответ

3 голосов
/ 01 апреля 2020

Ваша программа не создает никаких тем. Причина, по которой ваш метод run () печатает один и тот же идентификатор четыре раза, заключается в том, что вы вызываете его из одного и того же потока - основного потока - четыре раза. Единственный способ создать новый поток в Java - это если некоторый код (либо ваш собственный код, либо код в библиотеке, который вызывается вашим кодом) вызывает метод start () экземпляра Thread.

Вы не показали полное объявление класса, содержащего метод run(). Я собираюсь притвориться, что это выглядит так:

class MyThread implements Runnable {
    public void run() {
        ...
    }
}

Самый простой способ * вызвать метод run(), вызываемый новым потоком, - создать экземпляр MyThread и сделать его делегат экземпляра java.lang.Thread:

MyThread my_thread = new MyThread();
Thread t = new Thread(my_thread);
t.start();

Вызов t.start() - это то, что создает фактический поток операционной системы.


Примечание. Поскольку MyThread экземпляры на самом деле не являются потоками, лучшим именем может быть MyRunnable или любое имя, не содержащее "thread".


* Создание нового потока является серьезным затея. Если бы вы писали код для крупномасштабного программного проекта, ваши коллеги, вероятно, отговаривали бы вас от непосредственного создания экземпляров и start() новых Thread объектов. Возможно, вместо этого они попросят вас использовать пул потоков или фабрику потоков , предоставленную вашему коду другой частью системы.

Этот прием, который потенциально даст им лучшую возможность наблюдать и / или управлять потоками системы, является еще одним примером делегирования . Делегирование - это мощная техника, используемая в объектно-ориентированном программировании, которую стоит изучить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...