“Thread.currentThread().getName” 和 “this.getName” 有什么区别?

7
这是代码:

这是代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;


class UnCatchExceptionThread extends Thread{
    public UnCatchExceptionThread(String name){
        this.setName(name);
    }
    @Override
    public void run() {
        System.out.println("Thread name is: " + this.getName());
        throw new RuntimeException();
    }
}

class UnCatchExceptionHandler implements Thread.UncaughtExceptionHandler{
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("catch "  + e + " from " + t.getName());
    }
}

class HandlerFactory implements ThreadFactory{

    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r);
        t.setUncaughtExceptionHandler(new UnCatchExceptionHandler());
        return t;
    }

}
public class CaptureException {

    public int i;
    /**
     * @param args
     */
    public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool(new HandlerFactory());
        exec.execute(new UnCatchExceptionThread("Gemoji"));
    }

}

输出结果为:

线程名称是:Gemoji
捕获来自Thread-1的java.lang.RuntimeException异常

如果我更改了代码

System.out.println("Thread name is: " + this.getName());  

为了

System.out.println("Thread name is: " + Thread.currentThread().getName()); 

输出将变为:

线程名称为:Thread-1
从Thread-1捕获java.lang.RuntimeException异常

为什么?

2个回答

7
我假设在某个时刻,UnCatchExceptionThread被传递给你的HandlerFactory.newThread()方法,并且返回的线程将被执行。如果是这样的话,你将创建一个没有名称的新线程,该线程执行作为参数传递的可运行对象。可运行对象是UnCatchExceptionThread实例,但正在执行的线程是new Thread(r)。
因此,在Runnable的run方法中,this是UnCatchExceptionThread的实例,并具有您指定的名称。但是当前线程是new Thread(r),它具有默认名称。

我忘记了ThreadFactory接受Runnable作为参数,而且Thread也实现了Runnable。感谢您的帮助。 - PeaceMaker

0

执行器服务正在创建一个名为“Thread-1”的线程来运行给定可运行对象的run命令。因此,线程对象名称“Gemoji”不是真正运行的线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接