一、使用Thread.currentThread()
Thread类中提供了许多方法来处理线程相关的任务,其中currentThread()方法可以用于获取当前线程的引用。public class ExampleThread extends Thread { public void run() { System.out.println("当前线程是:" + Thread.currentThread().getName()); } public static void main(String[] args) { ExampleThread t1 = new ExampleThread(); ExampleThread t2 = new ExampleThread(); t1.start(); t2.start(); } }在上述代码中,我们使用了Thread.currentThread().getName()方法来获取当前线程的名称。输出结果类似于下面这样:
当前线程是:Thread-0
当前线程是:Thread-1
可以看到,当前线程的名称是以Thread-加数字的形式命名的,该数字是线程的编号。当然,在实际代码中,我们不应该仅仅只是获取当前线程的名称,而是应该更加深入地了解当前线程的所有属性。二、使用ThreadLocal类
ThreadLocal类是Java提供的一个线程局部变量类,它可以让我们为每个线程分配一个独立的实例。使用ThreadLocal来获取当前线程的方式如下:public class ExampleThreadLocal { private static final ThreadLocal<String> THREAD_NAME = new ThreadLocal<>(); public static void main(String[] args) { THREAD_NAME.set(Thread.currentThread().getName()); System.out.println("当前线程是:" + THREAD_NAME.get()); Thread t = new Thread(new Runnable() { @Override public void run() { THREAD_NAME.set(Thread.currentThread().getName()); System.out.println("当前线程是:" + THREAD_NAME.get()); } }); t.start(); } }在上述代码中,我们使用ThreadLocal类来存储当前线程的名称,并使用get()方法获取它。我们还创建了一个新线程来演示如何在另一个线程中使用ThreadLocal,可以看到,该新线程获得了不同的线程名称,这证明ThreadLocal确实可以为每个线程分配不同的实例。
三、使用InheritableThreadLocal类
InheritableThreadLocal类与ThreadLocal类相似,但是它可以用于创建可以被子线程继承的线程局部变量。使用InheritableThreadLocal来获取当前线程的方式如下:public class ExampleInheritableThreadLocal { private static final InheritableThreadLocal<String> THREAD_NAME = new InheritableThreadLocal<>(); public static void main(String[] args) { THREAD_NAME.set(Thread.currentThread().getName()); System.out.println("当前线程是:" + THREAD_NAME.get()); Thread t = new Thread(new Runnable() { @Override public void run() { System.out.println("当前线程是:" + THREAD_NAME.get()); } }); t.start(); } }在上述代码中,我们使用InheritableThreadLocal类来存储当前线程的名称,并使用get()方法获取它。与使用ThreadLocal的情况相比,我们创建的新线程实际上是子线程,并且它能够继承父线程的线程局部变量,因此它输出的结果与父线程相同。
四、获取线程组
除了获取当前线程的名称等,我们还可以获取线程的一些其他属性,例如线程组。可以通过以下代码来获取当前线程的线程组:public class ExampleThreadGroup { public static void main(String[] args) { ThreadGroup threadGroup = Thread.currentThread().getThreadGroup(); System.out.println("当前线程组是:" + threadGroup.getName()); } }在上述代码中,我们使用getThreadGroup()方法获取当前线程的线程组,并使用getName()方法获取其名称。输出结果如下:
当前线程组是:main
可以看到,当前线程的线程组名称是“main”,这也是默认的线程组名称。