我开始学习线程。我尝试过不同类型的线程创建。从下面的代码中你可以看到线程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
答案 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"));