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