Java多线程: All of my threads get the same thread id

标签 java multithreading

我需要在编程类(class)中的项目中使用多线程,因此为了练习并了解它是如何工作的,我使用了类(class)中提供的代码。但是,当我运行代码时,所有线程都具有相同的 ID,这是因为我的系统还是有其他原因?

这是代码:

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();
        }
    }
}

最佳答案

您的程序不会创建任何线程。 run() 方法之所以打印相同的 ID 四次,是因为您从同一个线程(“主”线程)调用它四次。在 Java 中创建新线程的唯一方法是某些代码(您自己的代码,或者由您的代码调用的库中的代码)调用 Thread 实例的 start() 方法。

您没有显示包含 run() 方法的类的完整声明。我将假装它看起来像这样:

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

让新线程调用 run() 方法的最简单方法*是创建一个 MyThread 实例,并将其设为 delegate java.lang.Thread 实例:

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

t.start() 调用创建实际的操作系统线程。


注意:由于 MyThread 实例实际上并不是线程,因此更好的名称可能是 MyRunnable 或任何不包含“thread”的名称。


* 创建新线程是一项严肃的任务。如果您正在为大型软件项目编写代码,您的同事可能会阻止您直接实例化和 start() 新的 Thread 对象。他们可能会要求您使用 thread pool thread factory 这是由系统的其他部分提供给您的代码的。

这个技巧可能会让他们更好地观察和/或管理系统线程,这是另一个例子 delegation 。委托(delegate)是面向对象编程中使用的一种强大技术,非常值得学习。

关于Java多线程: All of my threads get the same thread id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60968660/

相关文章:

java - 多线程类加载可能吗?

c++ - pthread_create 没有正确执行

c++ - Windows 线程-C++

c++ - 同步访问变量

java - 如何使用Java将Spark中数据库的列名更改为大写

java - 将 sql 翻译添加到 criteriaBuilder JPQL

java - Java 11 上 ShellFolder.getShellFolder() 的替换或使用方式

Java - JFrame 保存多行

python - 获得对 Python 队列的索引访问的最佳方法,线程安全

java - 如何在 java 中准备一个字符串,该字符串最终将传递到 SQL 中进行搜索