Java来看一道多线程面试题

问题:下面线程开启后会执行哪一句话会输出到控制台?
答:你好Thread 会被打印

public static void main(String[] args) {        Runnable runnable = new Runnable() {            @Override            public void run() {                System.out.println("你好Runable");            }        };        new Thread(runnable) {            @Override            public void run() {                System.out.println("你好Thread");            }        }.start();    }

解读

Runnable runnable = new Runnable() {            @Override            public void run() {                System.out.println("你好Runable");            }        };

上面的代码使用了匿名内部类的方式实现了Runnable接口,并用父类引用指向子类对象------多态。总之表示创建了Runnable接口实现类对象runnable。

new Thread(runnable)

使用有参构造创建Thread对象,也采用了匿名内部类实现。

 new Thread(runnable) {            @Override            public void run() {                System.out.println("你好Thread");            }        }.start();

这里表示匿名类的子类,因为有大括号重写,就表示子类。最终要的就是后面的start方法了。线程对象调用start对象后,操作系统(start方法底层调用了c语言我们暂时是看不到源码)会为我们调用线程的run方法,我们来看有参构造的执行流程。

我们发现最后Runnable接口实现类对象传递给了Thread的成员变量,我们现在再来看看操作系统为我们调用的run方法。

如果刚刚传递过去的Runnable接口实现类对象不为空,那么执行它的run();方法。以上就是有参Thread构造方法和start方法执行流程。
再回到面试题

 new Thread(runnable) {            @Override            public void run() {                System.out.println("你好Thread");            }        }.start();

我们发现Thread类中的run方法已经被重写,所以即使传递了runnable,也没有用,最后开启线程,执行了System.out.println(“你好Thread”);
思考
那么如何执行runnable里面的代码呢?手动执行就行了呗

new Thread(runnable) {            @Override            public void run() {                runnable.run();                System.out.println("你好Thread");            }        }.start();

或者我们调用一下父类有参构造里面的run方法也可以

new Thread(runnable) {            @Override            public void run() {                super.run();                System.out.println("你好Thread");            }        }.start();

运行结果

你好Runable你好Thread

来源:https://www.icode9.com/content-1-867251.html

(0)

相关推荐

  • 可重入锁详解(synchronized ReentrantLock)

    可重入锁详解 概述 什么是 "可重入",可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁.例如 package com.test.reen;// 演示可重入锁是什么 ...

  • Java并发多线程编程——Volatile原理与使用

    优质文章,第一时间送达 76套java从入门到精通实战课程分享 一.volitile的理解 Volatile称之为轻量级锁,被volatile修饰的变量,在线程之间是可见的. 可见即一个线程修改了这个 ...

  • Java学习-多线程

    多线程 任务(Task).进程(Process).线程(Thread) 进程的创建 1.继承Thread类 自定义线程类继承Thread类 重写run()方法,编写线程执行体 创建线程对象,调用sta ...

  • new Thread(new Runnable(){})

    一.写法介绍 JAVA是面向对象的,也就是说,对于一个方法等,它需要什么类型的对象,只要传入就可以了. 像这里,Thread类的构造方法中,需要一个实现了Runnable接口的对象,而new就是生成了 ...

  • Java并发编程之线程的创建

    简介 线程是基本的调度单位,它被包含在进程之中,是进程中的实际运作单位,它本身是不会独立存在.一个进程至少有一个线程,进程中的多个线程共享进程的资源. Java中创建线程的方式有多种如继承Thread ...

  • Java并发编程之内置锁(synchronized)

    简介 synchronized在JDK5.0的早期版本中是重量级锁,效率很低,但从JDK6.0开始,JDK在关键字synchronized上做了大量的优化,如偏向锁.轻量级锁等,使它的效率有了很大的提 ...

  • 100道Java并发和多线程基础面试题大集合(含解答),这波面试稳了~

    # 前言 这篇文章主要是对多线程的问题进行总结的,因此罗列了100个多线程的问题. 这些多线程的问题来源于各大网站,可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也都看过,但是本文 ...

  • Java开发工程师最新面试题库系列——Java基础部分(附答案)

    JAVA基础 如果你有更好的想法请在评论区留下您的答案,一起交流讨论 面向对象有哪些特征? 答:继承.封装.多态 JDK与JRE的区别是什么? 答:JDK是java开发时所需环境,它包含了Java开发 ...

  • java最常见200+面试题及解析

    题目整理 Java基础进阶阶段 基础概念类 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建 ...

  • 田开斌—— 2019年拉普拉塔河数学奥林匹克的一道取整函数试题及其解答

    万丈红尘三杯酒,千秋大业一壶茶 本文选自田开斌的新浪博客"杏坛孔门2014"的博文.田开斌,奥数高手,著名的"文武光华"掌门人之一,特长是十八般兵器样样精通.征 ...

  • java学习——109.多线程

    现在的操作系统均支持多线程. 多线程即将一个进程可以划分为多个线程,这样可以提高效率. Java支持多线程,实现起来也不复杂. 有两种方式实现多线程:继承Thread类和实现Runnable接口. 今 ...

  • 解答一道立体几何最小值试题

    解答一道立体几何最小值试题 浙江省平阳中学     洪一平 点评:这道最小值试题的几何背景可看作是圆台,上下底面圆半径分别为3和4,高为7,下底面内接△ABC,AC是直径,P是上底面圆周上,PB的最小 ...

  • 一份简单的Java基本数据类型基础面试题

    自Java于1996年发布以来,基本数据类型就是Java语言的一部分.通过对使用基本类型而不使用基本类型做Java基准测试,JohnMoore对为什么Java中要保持基本数据类型做了很好的解释.随后, ...

  • 一道解三角形试题的八种解法展示

    引例  (2017武汉四月调考理17)     分析:这是一道解三角形试题, 图1 解法1: 解法2: 解法1.2都面临同一个问题:AD的长度出现多解,需要进行取舍.审视△ABD和△ACD:都是已知两 ...

  • 一道中考化学试题-气体成分探究

    某兴趣小组计划对空气成分进行探究,以下是他们的实验设计方案: (1)除去二氧化碳和水蒸气:图1中装置B的作用是___________________,装置A.B顺序能否颠倒_________(填&qu ...