zoukankan      html  css  js  c++  java
  • Thread与Runnable的一个小陷阱

    Java里面运行一个线程可以通过继承Thread的方式,也可以通过实现Runnable的接口来实现,那么两者能不能混用呢,比如以下的例子:

    public class JavaTest extends Thread{
        public JavaTest(Runnable target) {
            super(target);
        }
    
        public void run() {
            System.out.println("run() in JavaTest thread.");
        }
    
        public static void main(String[] args) throws Exception {
    
            new JavaTest(new Runnable() {
                public void run() {
                    System.out.println("run() in Runnable.");
                }
            }).start();
        }
    }
    

    这段代码运行后,最终打印出了“run() in JavaTest thread”,为什么没有执行Runnable里面的run()方法呢,分析一下Thread的源码发现,其实Thread的构造函数接收Runnbale对象之后保存至一个名为target的私有变量,而Thread的run()方法调用了target的run()来执行,如下面的代码所示:

    public void run() {
        if (target != null) {
            target.run();
        }
    }
    

    而JavaTest类继承Thread之后覆写了run()方法,所以Runnbale所实现的run()方法并没有机会被调用到。

  • 相关阅读:
    汉诺塔
    协变和逆变随笔
    NetCore开发第一步 Log4Net日志引入
    插入排序算法
    选择排序算法
    冒泡排序算法
    排序算法
    线性链表
    SAN
    SAM -- Chap 8 提升方法 自我梳理
  • 原文地址:https://www.cnblogs.com/schbook/p/6050361.html
Copyright © 2011-2022 走看看