Java 基本线程创建-线程名称不正确

Java 基本线程创建-线程名称不正确,java,multithreading,Java,Multithreading,我开始学习线程。我尝试过不同类型的线程创建。从下面的代码中可以看到线程t4,目标是Mythread1的新实例&线程名称是“Thread4” 但是当我看到输出时,我无法找到线程名“thread4”,而是得到了名称“Thread-4”。但这是默认线程名称的命名约定 我不明白出了什么问题。我确信这是一个基本的错误。请纠正我 class MyThread1 extends Thread { MyThread1() { } public MyThread1(String name

我开始学习线程。我尝试过不同类型的线程创建。从下面的代码中可以看到线程t4,目标是Mythread1的新实例&线程名称是“Thread4”

但是当我看到输出时,我无法找到线程名“thread4”,而是得到了名称“Thread-4”。但这是默认线程名称的命名约定

我不明白出了什么问题。我确信这是一个基本的错误。请纠正我

class MyThread1 extends Thread {
    MyThread1() {

    }
    public MyThread1(String nameIn) {
        super(nameIn);
    }

    public void run() {
        System.out.println(this.getName());
    }
}

class MyThread2 implements Runnable {
    Thread ownThread;

    public MyThread2() {
    }

    public MyThread2(String nameIn) {
        ownThread = new Thread(this, nameIn);
    }

    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

public class ThreadCreation {
    public static void main(String[] args) {
        //Execution type1, as direct thread object
        MyThread1   t1 = new MyThread1();
        Thread      t2 = new MyThread1();
        Thread      t3 = new Thread(new MyThread1());
        Thread      t4 = new Thread(new MyThread1(), "Thread4");
        Thread      t5 = new MyThread1("Thread5");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();

        //Execution type2, pass the runnable object to thread constructor
        Thread      t11 = new Thread(new MyThread2());
        Thread      t22 = new Thread(new MyThread2(), "Thread22");
        MyThread2   t33 = new MyThread2("Thread33");

        t11.start();
        t22.start();
        t33.ownThread.start();
    }
}
输出:

线程-0 螺纹-2 线程-1 螺纹-4 螺纹5 螺纹22 螺纹-5 螺纹33


在MyThread1中,打印方法所在的线程对象的名称。由于在创建对象时没有指定其他名称,因此会为您生成一个顺序名称“Thread-4”

您应该打印执行线程的名称,如在MyThread2中,或者使用以下名称创建MyThread1对象:

Thread t4 = new Thread(new MyThread1("Thread4")); 
但是当我看到输出时,我无法找到线程名“thread4”,而是得到了名称“Thread-4”。但这是默认线程名称的命名约定

您的问题出现在如下代码中:

线程t4=新线程(新的MyThread1(),“Thread4”)

此代码将MyThread1用作可运行的,而不是线程。因此,当调用
run()
方法时,您是在
MyThread1
实例上调用
getName()
,而不是在实际运行并调用
run()
方法且其名称为
“Thread4”
的线程上。这就是为什么
MyThread2
类工作的原因,因为它使用
Thread.currentThread()
来显示真正运行的线程的名称

创建线程时,您需要
扩展线程
并将其作为
新的MyThread1(“Thread4”)
启动,或者实现
可运行
并执行
新线程(new MyRunnable1(),“Thread4”)。实现
Runnable
是推荐的模式,因为它允许您扩展其他类


您永远不希望执行类似于
新线程(新类扩展了线程(),“name”)
的操作。这会创建一个伪Java
线程
实例,这会让您感到困惑。

首先,解决方案是可行的。如果是这样的话,下一个顺序名称将是Thread-3,但为什么是Thread-4呢。Thread5的工作原理如何计数器从1开始,因此为第四个线程生成的名称是4而不是3。对于线程5,您已经在传递自己的名称。否计数器从0开始,线程t3为新的MyThread1()实例取两个名称thread-2,为t3取两个名称thread-3。如果您看到我的输出,线程从Thread-0开始,您是对的。。发生的事情是,输出不符合源代码顺序:t3打印线程4,t4打印线程5。这是完全正常的,因为执行顺序取决于调度程序,并且可能完全不可预测。我理解,不需要传递线程类对象来代替可运行对象。这将创建2个线程。谢谢。它不会创建两个本机线程,但会创建两个Java
Thread
对象。只有一个永远不会开始。