Как получить идентификатор потока?

1

Не могли бы вы помочь мне понять, почему этот проект всегда показывает мне идентификатор 9. Я имею в виду, что вывод выглядит следующим образом:

FirstThread.txt
Id 9
<Some string read from the file>
...
...
SecondThread.txt
Id 9
<Some string read from the file>

Я бы оценил Id как отличающийся. Этот идентификатор не изменяется, даже если я остановлю проект и запустил его снова.

package parallelprogramming;

import java.lang.Thread;
import java.io.*;

public class Thrd extends Thread {

    public boolean readFile(String File)/* throws FileNotFoundException */ {
        try {
            FileReader fr = new FileReader(File);
            BufferedReader br = new BufferedReader(fr);
            String s;
            try {
                while ((s = br.readLine()) != null) {
                    System.out.println(File);
                    System.out.println("Id " + this.getId());
                    System.out.println(s);
                }
                fr.close();
                return true;
            } catch (IOException IOE) {
                System.out.println("IOException caught!");
                return false;
            }
        } catch (FileNotFoundException FNFD) {
            System.out.println("File not found!");
            return false;
        }

    }
}



package parallelprogramming;

import java.awt.event.*;

import java.io.FileNotFoundException;

public class ParallelProgramming {

    public static void main(String[] args) {

        Thrd FirstThread = new Thrd();
        Thrd SecondThread = new Thrd();

        Thrd CurrentThread = null;
        String File = null;
        for (int i = 0; i < 1000000; i++) {
            if (i % 2 == 0) {
                File = "FirstThread.txt";
                CurrentThread = FirstThread;
            } else {
                File = "SecondThread.txt";
                CurrentThread = FirstThread;
            }
            while (!CurrentThread.isInterrupted()) {

                if (CurrentThread.readFile(File)) {

                    break;
                };
            }
        }

    }
}
Теги:

6 ответов

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

Насколько я вижу, здесь вы создаете только 2 потока:

    Thrd FirstThread = new Thrd();
    Thrd SecondThread = new Thrd();

Затем вы всегда используете FirstThread:

CurrentThread = FirstThread;

Таким образом, работает только один поток, и поэтому печатается один и тот же идентификатор.

Кстати, в java существуют соглашения об именах. Все переменные и методы начинаются с маленькой буквы. Ваша капитализация очень запутанна и делает ваш код менее удобочитаемым.

4

В вашем коде используется один поток: основной поток. Чтобы начать поток, вам нужно

  • расширяет поток
  • переопределить метод run()
  • создать экземпляр подкласса Thread
  • вызовите метод start()

Или вам нужно

  • создать Runnable
  • передать его конструктору потока
  • вызовите метод start() Thread

Это ясно объяснено в учебнике.

Расширение Thread, добавление метода (например, readFile()) к расширяющему классу и его вызов не вызовет этот метод в другом потоке.

Обратите внимание: соблюдайте соглашения об именах Java. Методы и переменные начинаются с строчной буквы.

1

Переменная CurrentThread всегда инициализируется как FirstThread. Также, несмотря на то, что вы расширили класс Thread, Threads не запускаются с использованием метода start(). Поэтому нет потоков, отличных от основного потока.

0

Не могли бы вы помочь мне понять, почему этот проект всегда показывает мне Id 9.

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

Поэтому, если вы снова запустите одно и то же приложение, а порядок создания потоков будет одинаковым, соответствующие потоки будут иметь одинаковые идентификаторы.

Однако, поскольку это поведение неуказано, было бы неразумно полагаться на него.

Таким образом, в вашем примере вы получаете одинаковые идентификаторы потоков, потому что ваше приложение создает их в том же порядке, от одного прогона к другому.

Я бы оценил [предположим?] Ид, чтобы быть другим.

Нет оснований для этого предположения в javadocs. И на самом деле это неверно.

0

у вас есть опечатка в вашем коде, вы каждый раз назначаете один и тот же поток.

Заменить:

if (i % 2 == 0) {
            File = "FirstThread.txt";
            CurrentThread = FirstThread;
        } else {
            File = "SecondThread.txt";
            CurrentThread = FirstThread;
        }

От

if (i % 2 == 0) {
            File = "FirstThread.txt";
            CurrentThread = FirstThread;
        } else {
            File = "SecondThread.txt";
            CurrentThread = SecondThread;
        }

Однако, возможно, вам стоит подумать о том, чтобы использовать ThreadName для идентификации ваших потоков: JavaDoc for Thread

0

Во- CurrentThread, CurrentThread всегда FirstThread.

С другой стороны, вы фактически не используете эти другие потоки в качестве потоков. Вы просто вызываете метод, как если бы это были другие объекты.

Переопределите public void run() в вашем классе Thrd и любой код внутри, который будет работать в отдельном потоке. Чтобы запустить каждый поток, используйте FirstThread.start(); и SecondThread.start(); ,

Ещё вопросы

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