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

时间:2013-10-09 18:32:44

标签: java multithreading

我开始学习线程。我尝试过不同类型的线程创建。从下面的代码中你可以看到线程t4,target是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   Thread5   Thread22   线程5   Thread33

2 个答案:

答案 0 :(得分:2)

  

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

你的问题是这样的代码:

  

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

此代码使用MyThread1作为Runnable作为主题。因此,当调用run()方法时,您正在getName()实例上调用MyThread1,而在实际运行的线程上调用而不是并调用{{1}方法,名称为run()。这就是"Thread4"类有效的原因,因为它使用MyThread2来显示真正运行的线程的名称。

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

从不想做Runnable之类的事情。这会创建一个假的Java new Thread(new ClassThatExtendsThread(), "name")实例,只会让您感到困惑。

答案 1 :(得分:0)

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

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

Thread t4 = new Thread(new MyThread1("Thread4"));