【Java多线程与并发】——Thread.currentThread().getName()和this.getName()区别

首先,Thread.currentThread().getName() 和 this.getName()都可以用来获得线程的名称,但是它们是有区别滴,不能乱用!

下面分别对这两个方法进行剖析:

先来说说currentThread()方法,它的源码如下,它是一个本地方法,方法返回一个Thread对象:
 

 /**
     * Returns a reference to the currently executing thread object.
     *
     * @return  the currently executing thread.
     */ public static native Thread currentThread();

接下来看看 getName()方法,它是Thread类中的一个方法(并不是Object类中的方法),源码如下:

 /**
     * Returns this thread's name.
     *
     * @return  this thread's name.
     * @see     #setName(String)
     */ public final String getName() { return String.valueOf(name); }

其中,name是Thread类中的一个域,是char[],getName()方法可以返回当前线程的名称。

所以我们可以总结:Thread.currentThread().getName()可以在任何情况下使用;而this.getName()必须在Thread类的子类中使用,this指代的必须是Thread对象!

为了更好的说明两者的差别,可以看以下代码:

public class MyThread extends Thread {
    public MyThread() {
        System.out.println(".....MyThread begin.....");
        System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getName());
        System.out.println("this.getName() = " + this.getName());
        System.out.println(".....MyThread end.......");
        System.out.println();
    }

    @Override
    public void run() {
        System.out.println(".....run begin.....");
        System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getName());
        System.out.println("this.getName() = " + this.getName());
        System.out.println(".....run end.......");
    }
}
    public class MyThreadTest {
        public static void main(String[] args) { // TODO Auto-generated method stub 
             MyThread mt = new MyThread();
             Thread t = new Thread(mt);
             t.setName("A"); t.start(); 
        } 
    }

输出结果为:

其中,Thread.currentThread().getName()调用的是执行此行代码的线程的getName方法;this.getName()调用的是mt对象的getName方法。区别显著有木有!!!

这里比较让人疑惑的是“this.getName() = Thread-0”,这个Thread-0是什么鬼???
通过查看Thread源码发现,在Thread类的构造方法中,会自动给name赋值,赋值代码:
 

"Thread-" + nextThreadNum()

 有兴趣的同学可以自己去查源码!
这就解释了为什么“this.getName() = Thread-0”。

其中,Thread.currentThread().getName()调用的是执行此行代码的线程的getName方法;this.getName()调用的是mt对象的getName方法。区别显著有木有!!!
---------------------
作者:wozhuhonghao
来源:优快云
原文:https://blog.youkuaiyun.com/u012665227/article/details/50242655
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>嗯,用户给了一个关于Java中使用Semaphore进行并发测试的代码片段,想让我生成完整的Java代码。首先,我需要理解用户提供的代码结构。他们创建了一个许可数为3的信号量,然后在try块里获取许可,执行一些操作,最后在finally块释放许可。用户可能希望模拟多个线程同时执行这段代码,以测试并发情况下的行为。 首先,我需要确定用户的需求。他们可能想要一个完整的可运行示例,展示多个线程如何使用信号量来控制资源访问。用户提供的代码看起来像是一个线程任务的一部分,所以应该把它放到Runnable中,并创建多个线程来执行这个任务。 接下来,我需要检查代码是否有语法错误。比如,用户用了双引号“”可能不是正确的符号,应该是英文的""。另外,变量result在代码中被赋值为"Success",但之后没有使用,可能需要打印出来或者做其他处理,但可能用户只是想展示基本结构,所以暂时保留。 然后,考虑如何组织完整的Java类。需要导入必要的包,比如java.util.concurrent.Semaphore。主类应该包含main方法,创建信号量、线程池,并提交任务。使用线程池可以方便地管理多个线程,比如固定大小的线程池,比如5个线程,这样能超过信号量的许可数,展示等待效果。 另外,用户提供的代码中的System.out.println语句里的字符串拼接有问题,应该用+连接变量,比如"锁住 " + Thread.currentThread().getName()。需要确保字符串拼接正确,避免编译错误。 还要考虑异常处理,虽然用户已经捕获了异常,但在catch块里可能只是打印堆栈跟踪,这已经足够。在finally块中释放许可是正确的做法,确保即使发生异常也能释放资源。 接下来,我需要构造一个完整的Java程序。主类可能叫做SemaphoreTest,其中包含main方法。在main方法中初始化信号量,创建线程池,提交任务,并关闭线程池。每个任务都是一个Runnable实例,执行acquire、执行任务、release的流程。 可能的疑问是,用户是否希望使用公平锁策略,因为信号量构造函数的第二个参数是true,即公平模式。这会影响线程获取许可的顺序,按照请求顺序来分配,这可能对测试结果有影响,需要指出。 最后,确保代码示例正确无误,并且能够运行。比如,线程池的正确关闭,使用awaitTermination来等待所有任务完成。这样用户在运行代码时可以看到所有线程的执行情况,包括等待释放的过程。 总结步骤:导入包,创建信号量,创建线程池,提交任务,执行任务代码,关闭线程池。检查字符串拼接、异常处理资源释放是否正确。然后生成相关问题,比如信号量的作用、公平非公平的区别、线程池的作用等。</think>以下是完整的Java并发测试代码示例: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreTest { // 创建许可数为3的公平信号量 private static final Semaphore permit = new Semaphore(3, true); public static void main(String[] args) { // 创建固定大小线程池(5个线程) ExecutorService executor = Executors.newFixedThreadPool(5); // 提交5个并发任务 for (int i = 0; i < 5; i++) { executor.submit(() -> { String result = ""; try { // 获取令牌 System.out.println("锁住 " + Thread.currentThread().getName()); permit.acquire(); System.out.println("下载中 " + Thread.currentThread().getName()); // 模拟下载操作 Thread.sleep(5000); result = "Success"; } catch (Exception e) { e.printStackTrace(); } finally { // 释放令牌 permit.release(); System.out.println("释放 " + Thread.currentThread().getName() + " 结果: " + result); } }); } // 关闭线程池 executor.shutdown(); } } ``` 执行结果示例: ``` 锁住 pool-1-thread-1 下载中 pool-1-thread-1 锁住 pool-1-thread-2 下载中 pool-1-thread-2 锁住 pool-1-thread-3 下载中 pool-1-thread-3 锁住 pool-1-thread-4 // 第4个线程需要等待前3个释放许可 下载中 pool-1-thread-4 锁住 pool-1-thread-5 下载中 pool-1-thread-5 释放 pool-1-thread-1 结果: Success 释放 pool-1-thread-3 结果: Success 释放 pool-1-thread-2 结果: Success 释放 pool-1-thread-4 结果: Success 释放 pool-1-thread-5 结果: Success ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值