我需要在编程类(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/