How is default new thread name given in java?

2020-02-06 06:53发布

When I run this program

public class Fabric extends Thread {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Fabric());
        Thread t2 = new Thread(new Fabric());
        Thread t3 = new Thread(new Fabric());
        t1.start();
        t2.start();
        t3.start();
    }
    public void run() {
        for(int i = 0; i < 2; i++)
        System.out.print(Thread.currentThread().getName() + " ");
    }
}

I get output

Thread-1 Thread-5 Thread-5 Thread-3 Thread-1 Thread-3

Is there any specific reason why the threads are given names with odd numbers - 1, 3, 5... Or is it unpredictable?

4条回答
看我几分像从前
2楼-- · 2020-02-06 07:06
new Thread(new Fabric());

Since Fabric is a Thread, you created 2 threads here :)

JDK8 code:

/* For autonumbering anonymous threads. */
private static int threadInitNumber;
private static synchronized int nextThreadNum() {
    return threadInitNumber++;
}
查看更多
来,给爷笑一个
3楼-- · 2020-02-06 07:15

As others have pointed out, it's just an incrementing counter.

The reason why your log file does not print your thread names in order, is because java does not guarentee the order of execution of the started threads.

If you want to force the order, then you have to make the threads wait for eachother. A possible way to do this, is using a CountDownLatch.

private static CountDownLatch latch;

public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(new Fabric());
    Thread t2 = new Thread(new Fabric());
    Thread t3 = new Thread(new Fabric());

    // the countdown starts at 1.
    latch = new CountDownLatch(1);
    t1.start();
    // the thread will wait till the countdown reaches 0. 
    latch.await();

    latch = new CountDownLatch(1);
    t2.start();
    latch.await();

    latch = new CountDownLatch(1);
    t3.start();
    latch.await();
}
public void run() {
    for(int i = 0; i < 2; i++)
      System.out.print(Thread.currentThread().getName());

  // thread is done: set counter to 0.
  latch.countDown();
}

On the other hand, some classes use a ThreadFactory to assign thread names. (e.g. a ScheduledThreadPoolExecutor). For example the DefaultThreadFactory creates its thread names as follows:

String namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-";
String threadName = namePrefix + threadNumber.getAndIncrement()
查看更多
家丑人穷心不美
4楼-- · 2020-02-06 07:21

If you change the program like given below you will get the thread numbering in sequence.

    public class Fabric extends Thread {
    public static void main(String[] args) {
        Thread t1 = new Fabric();
        Thread t2 = new Fabric();
        Thread t3 = new Fabric();
        t1.start();
        t2.start();
        t3.start();
    }
    public void run() {
        for(int i = 0; i < 2; i++)
            System.out.print(Thread.currentThread().getName() + " ");
    }
}

and the output is

Thread-0 Thread-2 Thread-2 Thread-1 Thread-0 Thread-1
查看更多
Melony?
5楼-- · 2020-02-06 07:28

The default numeric value in the Thread name is an incremented value unless the name is specified when creating the Thread. Fabric extends Thread, and you are passing the Fabric instance to create another Thread - thus the internal Thread counter is incremented twice as 2 threads are created during the process.

查看更多
登录 后发表回答