-1

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

但是当我看到输出时,我找不到线程名称“Thread 4”,而是得到了名称“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

4

2 回答 2

2

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

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

线程 t4 = new Thread(new MyThread1(), "Thread4");

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

当您创建一个线程时,您需要将extend Thread其启动为new MyThread1("Thread4") 实现Runnable并执行new Thread(new MyRunnable1(), "Thread4");。实施 ofRunnable是推荐的模式,因为它允许您扩展其他类。

永远不想做类似的事情new Thread(new ClassThatExtendsThread(), "name")。这会创建一个只会让您感到困惑的虚假 JavaThread实例。

于 2013-10-09T18:42:44.057 回答
0

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

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

Thread t4 = new Thread(new MyThread1("Thread4")); 
于 2013-10-09T18:38:39.860 回答