Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';这两者之间的区别是什么;Thread.currentThread().getName";及;这个.getName";?_Java_Multithreading - Fatal编程技术网

Java 什么';这两者之间的区别是什么;Thread.currentThread().getName";及;这个.getName";?

Java 什么';这两者之间的区别是什么;Thread.currentThread().getName";及;这个.getName";?,java,multithreading,Java,Multithreading,代码如下: 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(n

代码如下:

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
从线程1捕获java.lang.RuntimeException

如果我改变了密码

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

输出将更改为

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


为什么?

我假设在某一时刻,UnCatchExceptionThread被传递给您的
HandlerFactory.newThread()
方法,并且该方法返回的线程被执行。如果是这样,您将创建一个没有名称的新线程,该线程将执行作为参数传递的runnable。runnable是UnCatchExceptionThread实例,但正在执行的线程是
新线程(r)


因此,在Runnable
run
方法中,
this
是UnCatchExceptionThread的实例,并且具有您给他的名称。但是当前线程是
新线程(r)
,它有一个默认名称。

执行器服务正在创建一个线程“thread-1”,以从给定的runnable运行run命令。因此线程对象名“Gemoji”不是正在运行的真正线程。

我忘记了
ThreadFactory
接受
Runnable
作为参数,并且
thread
也实现
Runnable
。谢谢你的帮助。
System.out.println("Thread name is: " + Thread.currentThread().getName());