Не могли бы вы помочь мне понять, почему этот проект всегда показывает мне идентификатор 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;
};
}
}
}
}
Насколько я вижу, здесь вы создаете только 2 потока:
Thrd FirstThread = new Thrd();
Thrd SecondThread = new Thrd();
Затем вы всегда используете FirstThread
:
CurrentThread = FirstThread;
Таким образом, работает только один поток, и поэтому печатается один и тот же идентификатор.
Кстати, в java существуют соглашения об именах. Все переменные и методы начинаются с маленькой буквы. Ваша капитализация очень запутанна и делает ваш код менее удобочитаемым.
В вашем коде используется один поток: основной поток. Чтобы начать поток, вам нужно
run()
start()
Или вам нужно
start()
ThreadЭто ясно объяснено в учебнике.
Расширение Thread, добавление метода (например, readFile()
) к расширяющему классу и его вызов не вызовет этот метод в другом потоке.
Обратите внимание: соблюдайте соглашения об именах Java. Методы и переменные начинаются с строчной буквы.
Переменная CurrentThread
всегда инициализируется как FirstThread
. Также, несмотря на то, что вы расширили класс Thread, Threads не запускаются с использованием метода start()
. Поэтому нет потоков, отличных от основного потока.
Не могли бы вы помочь мне понять, почему этот проект всегда показывает мне Id 9.
Механизм, с помощью которого генерируются идентификаторы потоков, не указан... но если вы посмотрите на код, вы увидите, что это делается с помощью простого счетчика, который начинается с нуля.
Поэтому, если вы снова запустите одно и то же приложение, а порядок создания потоков будет одинаковым, соответствующие потоки будут иметь одинаковые идентификаторы.
Однако, поскольку это поведение неуказано, было бы неразумно полагаться на него.
Таким образом, в вашем примере вы получаете одинаковые идентификаторы потоков, потому что ваше приложение создает их в том же порядке, от одного прогона к другому.
Я бы оценил [предположим?] Ид, чтобы быть другим.
Нет оснований для этого предположения в javadocs. И на самом деле это неверно.
у вас есть опечатка в вашем коде, вы каждый раз назначаете один и тот же поток.
Заменить:
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
Во- CurrentThread
, CurrentThread
всегда FirstThread
.
С другой стороны, вы фактически не используете эти другие потоки в качестве потоков. Вы просто вызываете метод, как если бы это были другие объекты.
Переопределите public void run()
в вашем классе Thrd
и любой код внутри, который будет работать в отдельном потоке. Чтобы запустить каждый поток, используйте FirstThread.start();
и SecondThread.start();
,