深入理解Thread构造函数

本文详细解读Java线程的九种构造方法,重点讲解线程命名规则,自定义命名、默认命名与线程父子关系。深入理解ThreadGroup的作用及如何设置线程所属组。

java.lang.Thread类中提供了九种构造方法

public Thread()
public Thread(Runnable target)
public Thread(ThreadGroup group, Runnable target)
public Thread(String name)
public Thread(ThreadGroup group, String name)
public Thread(Runnable target, String name)
public Thread(ThreadGroup group, Runnable target, String name)
public Thread(ThreadGroup group, Runnable target, String name,long stackSize)
public Thread(ThreadGroup group, Runnable target, String name,long stackSize, boolean inheritThreadLocals)

2.1线程的命名

        每个线程都会有自己的名字,我们可以自定义名字,也可以使用默认名字,一般为了方便排除问题我们会采用自定义命名线程

2.1.1线程的默认命名

  • public Thread()
  • public Thread(Runnable target)
  • public Thread(ThreadGroup group, Runnable target)

这三个构造函数在创建线程时采用自定义命名,我们通过Thread.currentThread().getName()可获得当前线程的名称,这里直接看一下源码

这里主要看name:这里

 

因此我们创建的线程的名称从Thread0开始依次加一

public class demo {
    public static void main(String[] args) {
        Thread thread1 = new ThreadDemo();
        Thread thread2 = new ThreadDemo();
        Thread thread3 = new ThreadDemo();
        Thread thread4 = new ThreadDemo();
        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
    }
}
class ThreadDemo extends Thread{
    @Override
    public void run() {
        System.out.println("线程名称"+Thread.currentThread().getName());
    }
}

 运行结果

 

 2.1.2命名线程

  • public Thread(String name)
  • public Thread(ThreadGroup group, String name)
  • public Thread(Runnable target, String name)
  • public Thread(ThreadGroup group, Runnable target, String name)
  • public Thread(ThreadGroup group, Runnable target, String name,long stackSize, boolean inheritThreadLocals)

我举一个例子,剩下的家人们自己来

public class demo {
    public static void main(String[] args) {
        Thread thread = new Thread("自定义名称"){
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        };
        thread.start();
    }
}

2.1.3修改线程名称

        在线程启动之前也就是,start之前,我们还有一次机会为线程命名,一旦线程启动就我发命名了,这个容易李姐,就像和谐号都出发了你要它改名

我们可以使用setName方法设置

下面时setName源码

 2.2线程的父子关系

一个线程的创建肯定是有另一个线程完成的

被创建线程的父线程是创建它的线程

2.3Thread与ThreadGroup

在构造函数中我们可以指定线程的线程组,如果不指定线程组,线程将默认加入父线程的线程组

下面是Thread.init方法,印证了我们上面所说

        //取当前创建的线程作为该线程的父线程
        Thread parent = currentThread();
        SecurityManager security = System.getSecurityManager();
        if (g == null) {
            /* Determine if it's an applet or not */

            /* If there is a security manager, ask the security manager
               what to do. */
            if (security != null) {
                g = security.getThreadGroup();
            }

            /* If the security doesn't have a strong opinion of the matter
               use the parent thread group. */
            if (g == null) {
                g = parent.getThreadGroup();
            }
        }

我们来练习一下

public class test{
    public static void main(String[] args){
        //创建一个不指定组的线程        
        Thread t1 = new Thread("t1");
        //创建一个线程组
        ThreadGroup group = new ThreadGroup("TestGroup");
        //创建一个指定线程组的线程
        Thread t2 = new Thread(group,"t2");
        //获取main线程的线程组
        ThreadGroup mainGroup = Thread.currentThread().getTreadGroup();
        System.out.println("main的线程组"+mainGroup);
        System.out.println("t1的线程组"+t1.getThreadGroup());
        System.out.println("t2的线程组"+t2.getThreadGroup());

    }
}

2.4Thread与Runnable

        Thread负责线程本身相关的职责和控制,Runnable则负责逻辑执行单元的部分(之前说过Runnable没有start方法,所以只负责逻辑执行单元部分)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不背八股睡不着

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值