Java 如何获取线程的id?

Java 如何获取线程的id?,java,Java,你能帮我理解为什么这个项目总是显示Id 9吗。我的意思是输出如下: FirstThread.txt Id 9 <Some string read from the file> ... ... SecondThread.txt Id 9 <Some string read from the file> FirstThread.txt Id 9 ... ... SecondThread.txt Id 9 我估计我的身份证不一样。即使我停止项目并再次运行它,此Id也不会更改

你能帮我理解为什么这个项目总是显示Id 9吗。我的意思是输出如下:

FirstThread.txt
Id 9
<Some string read from the file>
...
...
SecondThread.txt
Id 9
<Some string read from the file>
FirstThread.txt
Id 9
...
...
SecondThread.txt
Id 9
我估计我的身份证不一样。即使我停止项目并再次运行它,此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;
                };
            }
        }

    }
}
包并行编程;
导入java.lang.Thread;
导入java.io.*;
公共类Thrd扩展线程{
公共布尔读取文件(字符串文件)/*抛出FileNotFoundException*/{
试一试{
FileReader fr=新的FileReader(文件);
BufferedReader br=新的BufferedReader(fr);
字符串s;
试一试{
而((s=br.readLine())!=null){
System.out.println(文件);
System.out.println(“Id”+this.getId());
系统输出打印项次;
}
fr.close();
返回true;
}捕获(IOE异常IOE){
System.out.println(“IOException捕获!”);
返回false;
}
}捕获(FileNotFoundException FNFD){
System.out.println(“未找到文件!”);
返回false;
}
}
}
包并行编程;
导入java.awt.event.*;
导入java.io.FileNotFoundException;
公共类并行编程{
公共静态void main(字符串[]args){
Thrd FirstThread=新Thrd();
Thrd SecondThread=新Thrd();
Thrd CurrentThread=null;
字符串文件=null;
对于(int i=0;i<1000000;i++){
如果(i%2==0){
File=“FirstThread.txt”;
CurrentThread=FirstThread;
}否则{
File=“SecondThread.txt”;
CurrentThread=FirstThread;
}
而(!CurrentThread.isInterrupted()){
if(CurrentThread.readFile(文件)){
打破
};
}
}
}
}

您的代码使用一个线程:主线程。要开始一个线程,您需要

  • 延长线程
  • 重写其
    run()
    方法
  • 实例化线程子类
  • 调用它的
    start()
    方法
或者你需要

  • 创建一个可运行的
  • 将其传递给线程构造函数
  • 调用线程的
    start()
    方法
这一点在本文中有明确的解释

扩展线程时,向扩展类添加一个方法(如
readFile()
)并调用它,将不会在另一个线程中调用此方法


旁注:请遵守Java命名约定。方法和变量以小写字母开头。

您的代码使用一个线程:主线程。要开始一个线程,您需要

  • 延长线程
  • 重写其
    run()
    方法
  • 实例化线程子类
  • 调用它的
    start()
    方法
或者你需要

  • 创建一个可运行的
  • 将其传递给线程构造函数
  • 调用线程的
    start()
    方法
这一点在本文中有明确的解释

扩展线程时,向扩展类添加一个方法(如
readFile()
)并调用它,将不会在另一个线程中调用此方法


旁注:请遵守Java命名约定。方法和变量以小写字母开头。

首先,
CurrentThread
总是
FirstThread

另一方面,您实际上并没有将其他线程用作线程。您只是在调用一个方法,就好像它们是任何其他对象一样


重写
Thrd
类中的
public void run()
,以及其中将在单独线程中运行的任何代码。要启动每个线程,请使用
FirstThread.start()
SecondThread.start()
首先,
CurrentThread
总是
FirstThread

另一方面,您实际上并没有将其他线程用作线程。您只是在调用一个方法,就好像它们是任何其他对象一样


重写
Thrd
类中的
public void run()
,以及其中将在单独线程中运行的任何代码。要启动每个线程,请使用
FirstThread.start()
SecondThread.start()

据我所知,您在此处仅创建了两个线程:

    Thrd FirstThread = new Thrd();
    Thrd SecondThread = new Thrd();
那么您实际上总是使用
FirstThread

CurrentThread = FirstThread;
因此,只有一个线程工作,因此打印相同的ID


顺便说一句,java中有命名约定。所有变量和方法都以小写字母开头。您的大小写非常混乱,使代码可读性降低

据我所知,您在这里只创建了两个线程:

    Thrd FirstThread = new Thrd();
    Thrd SecondThread = new Thrd();
那么您实际上总是使用
FirstThread

CurrentThread = FirstThread;
因此,只有一个线程工作,因此打印相同的ID

顺便说一句,java中有命名约定。所有变量和方法都以小写字母开头。您的大小写非常混乱,使代码可读性降低

你能帮我理解为什么这个项目总是显示Id 9吗

未指定生成线程ID的机制。。。但是如果你看一下,你会发现它是用一个从零开始的简单计数器来完成的

因此,如果再次运行相同的应用程序,并且线程创建顺序相同,则相应的线程将具有相同的ID

然而,由于这种行为没有具体说明,因此依赖它是不明智的

因此,在您的示例中,您将获得相同的线程ID,因为您的应用程序从一次运行到下一次运行都是按照相同的顺序创建它们的

我估计[假设]Id是不同的

javadocs中没有这个假设的基础。事实上,这是不正确的

你能帮我理解为什么这个项目总是显示出来吗