我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样.显然,这是错误的假设.

public class App {

    static class TestedThread extends Thread {
        public void run() {
            // System.out.println(Thread.currentThread().getName()); // is ok
            System.out.println(this.getName());// Why is there difference?
        }
    }

    public static void main(String[] args) {
        TestedThread base = new TestedThread();
        // base.start();

        Thread derived = new Thread(base);
        derived.setName("derived");
        derived.start();
    }
}

Is it something like that? enter image description here

推荐答案

如你所知,不合格的getName()呼叫与this.getName()呼叫是一样的.当您启动derived线程时,它们返回不同的名称,因为thisThread.currentThread()不同.

你用the constructor表示derived,然后用Runnable表示.这将创建一个运行Runnable的新线程(调用run方法).您传递的参数base是一个Thread对象,也恰好是Runnable.

然而,baseThread(而不是其他Runnable)这一事实无关紧要.derived.start()仍然只通过调用base.run()来启动derived线程.它不会启动base线程.

所以Thread.currentThread()derived线程,但this指的是base线程.

Java相关问答推荐

javafx getHostServices(). showDocument()调出Chrome而不是默认浏览器(Linux)

JPackage-results已安装-如何添加系统属性?

Spring boot:Bean和动态扩展器

Jooq外键关系

Spring Batch 5-不要让它在数据库中自动创建表

确定Java中Math.Ranb()输出的上限

所有 case 一起输入时输出错误,而单独放置时输出正确

Kotlin内联互操作:强制装箱

具有阻塞方法的开源库是否应该为执行提供异步选项?

在Java中如何从Executors.newFixedThreadPool(MAX_THREAD_COUNT())迁移到虚拟线程

生成桥方法以解决具有相同擦除的冲突方法

Jenv-相同的Java版本,但带有前缀

Java连接池无法正常工作

A.ForEach与For(类型a:集合)

如何在ImageIO或十二只猴子中旋转TIFF CMYK图像?

在Java中将对象&转换为&q;HashMap(&Q)

如何在MPAndroidChart中的条形图上正确添加标签

如何以事务方式向ibmmq发送消息

Maven创建带有特定类的Spring Boot jar和普通jar

在不带instanceof或switch的java中记录模式