This is the code:
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"));
}
}
And the output is:
Thread name is: Gemoji
catch java.lang.RuntimeException from Thread-1
If I changed the code
System.out.println("Thread name is: " + this.getName());
to
System.out.println("Thread name is: " + Thread.currentThread().getName());
The output will change to
Thread name is: Thread-1
catch java.lang.RuntimeException from Thread-1
Why?
I assume that at one moment, the UnCatchExceptionThread is passed to your HandlerFactory.newThread() method, and the thread returned by this method is executed. If so, you create a new thread with no name, that executes the runnable passed as argument. The runnable is the UnCatchExceptionThread instance, but the thread that is executing is the new Thread(r).
So, inside the Runnable run method, this is the instance of UnCatchExceptionThread, and has the name you gave him. But the current thread is new Thread(r), which has a default name.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With