【问题标题】:Default naming Convention of Thread线程的默认命名约定
【发布时间】:2017-06-03 16:42:42
【问题描述】:
public class ThreadNaming extends Thread {
    public void run(){
        System.out.println(Thread.currentThread().getName());
    }
public static void main(String args[]){
    Thread t1 = new ThreadNaming();
    Thread t2 = new ThreadNaming();
    t1.start();
    System.out.println(t1);
    t2.start();
    System.out.println(t2);
    }
}

输出: 线程[Thread-0,5,main] 线程-0 线程[Thread-1,5,main] 线程 1

public class ThreadOddNaming extends Thread {
    public void run(){
        System.out.println(Thread.currentThread().getName());
    }
public static void main(String args[]){ 
    Thread t3 = new Thread(new ThreadOddNaming());
    Thread t4 = new Thread(new ThreadOddNaming());
    t3.start();
    t4.start();
    System.out.println(t3);
    System.out.println(t4);
}
}

输出: 线程[Thread-1,5,main] 线程 3 线程 1 线程[Thread-3,5,main]

现在,我有两个问题。

  1. 当使用带有类名(扩展线程)构造函数的 new 关键字创建线程时,线程命名为以 0、1、2、3 .. (n-1) 开头的整数。 但是当它直接用Thread构造函数传递类名(扩展Thread)作为参数创建时,线程命名为奇数,以1,3,5..(2n-1)开头

为什么会显示这种行为,或者它对于平台是否是恒定的? (我在 Windows 系统中运行了这个程序)。 或者,它可能会针对不同的平台显示不同的行为?

  1. 每当我们打印任何线程对象时,为什么线程的优先级总是5。

分配给线程的默认优先级是 NORM_PRIORITY。 那么,5 是 NORM_PRIORITY 的值吗?

【问题讨论】:

  • 因为new Thread(new ThreadOddNaming())创建了两个Thread实例。

标签: java multithreading


【解决方案1】:

当使用带有类名(扩展线程)构造函数的new关键字创建线程时,线程命名为以0、1、2、3..(n-1)开头的整数。但是当它直接用Thread构造函数传递类名(扩展Thread)作为参数创建时,线程命名为奇数,以1,3,5..(2n-1)开头

这是因为

Thread t3 = new Thread(new ThreadOddNaming());

Thread t4 = new Thread(new ThreadOddNaming());

总共创建 4 个线程。这就是您看到这种行为的原因。

每当我们打印任何线程对象时,为什么线程的优先级总是5。

因为 Thread 类的默认优先级是 NORM_PRIORITY。

public final static int NORM_PRIORITY = 5;

您可以在 Thread 的源代码here 中看到这一点。

请记住,尽管新创建线程的优先级始终与其创建者具有相同的优先级。因此,如果您有一个优先级为 4 的线程创建一个新线程,那么新线程将是优先级 4,除非使用 setPriority() 另行设置

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多