2013-10-09 29 views
-1

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

但是,当我看到输出时,我无法找到线程名称“线程4”,而是获得名称“线程-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 Thread5 Thread33

回答

2

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

您的问题是在这样的代码:

线程T4 =新主题(新MyThread1(), “Thread4”);

该代码使用MyThread1作为Runnable作为线程。因此,当run()方法被调用,然后你调用getName()MyThread1实例,,实际上是运行并在调用run()方法的线程上的名字是"Thread4"。这就是为什么MyThread2类可以工作,因为它使用Thread.currentThread()来显示真正运行的线程的名称。

当你创建一个线程,无论你需要extend Thread,并启动它new MyThread1("Thread4")实施Runnablenew Thread(new MyRunnable1(), "Thread4");。推荐使用Runnable,因为它允许您扩展其他类。

从来没有想做点像new Thread(new ClassThatExtendsThread(), "name")。这会产生一个假的Java Thread实例,这会让你感到困惑。

+1

我明白了,不需要传递一个Thread类对象来代替一个可运行的对象。这创建了2个线程。谢谢。 –

+1

它不会创建两个_native_线程,但它确实会创建两个Java'Thread'对象。只有一个从未开始。 – Gray

0

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

你应该是打印的执行线程的名字,就像在MyThread2,或同一个名字创建MyThread1对象:

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

首先,解决方案有效。现在如果是这种情况,下一个顺序名称将是Thread-3,但为什么是Thread-4。Thread5的工作方式如何? –

+0

计数器从1开始,所以为第四个线程生成的名称的值为4而不是3.对于线程5,您已经传递了自己的名称。 – Joni

+1

没有计数器从0开始,线程t3为新的MyThread1()实例提供2个名称的线程2,为t3提供3个线程。如果你看到我的输出,线程从Thread-0开始 –