前言

某一天清晨(9:00),装逼界俩泰斗早早到了公司。

狗剩:龙Gie,去不去蹲坑,趁现在没人,去占个好位置,然后给你看个好宝贝。

我:臭不要脸,大清早就想着蹲坑划水,我平是怎么教育你的,能不能向我学习。

我:真香.....

狗剩子:花Gie,听说隔壁组的毛孩离职进了那个姓阿的公司,这尼玛简直太气人了。

我:你还别不服气,人家肚里真的有货,不信我问你几个问题,看看你能不能答上来?

正文

我:你用过多线程吗?创建线程的方式有几种?

这种问题还拿出来问,你是来侮辱俺的智商么,创建线程的典型方式有两种,分别是实现Runnable接口和继承Thread类,此外还可以通过线程池、定时器、匿名内部类等来进行创建。

我:还有其他的吗?

心中嘀咕:这特么话问的想给我下套啊。啊..那个..有的。

虽然说了这么多创建线程的方式,但我们查看源码就会发现,其实本质上只有一种,那就是通过新建Thread类来创建线程,并最终通过start方法来新建线程,只是run方法的实现有两种。

  • 第一种继承Thread类是重写父类run方法
  • 而第二种实现Runnable是对接口的run方法进行实现,然后将runnable实例传递给Thread类。

1)新建Thread类,run方法实现

//实现方式
class ThreadTest extends Thread{@Overridepublic void run() {System.out.println("我爱杰伦");}
}Thread thread = new Thread(new ThreadTest());thread.start();//线程最终调用target.run()
private Runnable target;
@Overridepublic void run() {if (target != null) {target.run();}}
复制代码

2) 实现Runnable,run方法实现

Thread thread = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("大家好,我叫狗剩子");}
});
thread.start();
复制代码

至于线程池、定时器等工具类本质上也是上述的一种实现。

小样,是不是偷看过花Gie的笔记了,那你知道继承Thread和实现Runnable接口哪种更好?

实现Runnable接口更好,主要原因有以下几个:

  • Java是单继承,如果继承Thread类后,会限制扩展性。
  • 实现Runnable接口将具体的任务(run方法)和创建线程(Thread类)分开实现,这样可以使同一个任务类传递给不同的线程,任务类不负责创建线程等工作,两者各司其职,从而实现解耦。
  • 使用继承Thread类创建线程,每次新建任务,只能创建一个新的线程,即使该任务只是打印一行日志,也要完成线程的创建销毁等过程,造成资源的严重浪费。而Runnable和线程池就能避免这种浪费。

那你知道线程有哪几种状态?它的生命周期是什么吗?

花Gie ,你把手伸过来,我给你看一样东西你就全懂了。

这啥,你踏马....!

不好意思...拿错了,把我早餐大包子拿出来了,在这...是这个

这个图是我见过画的最好的图,我们可以看到Java线程共计包含六个生命周期。

  • 新建(New):创建一个线程对象。

    1. JVM为其分配内存,并初始化其成员变量的值;
    2. 该状态下线程也不会得到调度。
  • 就绪状态(Runnable):当线程对象调用start方法之后,就会进入就绪状态,需要注意的是线程获取到时间片后依旧会处以Runnable状态。

    1. JVM创建方法调用栈和程序计数器;
    2. 该状态的线程一直处于线程就绪队列(尽管采用的是队列形式,事实上,把它成为可运行池而不是可运行队列。因为CPU的调度不一定是按照先进先出的顺序来调度的),线程并没有开始运行;
    3. 线程并不是说执行了start()方法就立即执行,需要等待系统为其分配CPU时间片。
  • 阻塞状态(Blocked):处于运行状态的线程,遇到某些情况会让出自己的CPU执行权,进入阻塞状态。

    进入阻塞状态的情况:

    1. 线程试图获取synchronized方法/代码块,但monitor锁被其他线程占用;
    2. 线程调用sleep方法,主动进入休眠,待休眠结束进入就绪状态等待获取CPU执行权;
    3. 线程调用持有锁的wait方法;
    4. 线程调用阻塞式IO方法,在方法返回前,该线程一直被阻塞。
  • 死亡(Terminated):线程执行完成或者抛出异常,线程资源被回收。

    线程进入死亡状态3种方法:

    1. run()或call()方法执行完成,线程正常结束;
    2. 线程抛出一个未捕获的异常;
    3. 直接调用该线程的stop()方法——容易导致死锁,不推荐使用。

    敲黑板:下图是Java官方文档,Java线程没有Running状态,其Runnable包含了操作系统中ready和running状态。

哟,小伙子有点东西啊,上面你说线程调用start()方法最终调用的是run()方法,

那为什么我们不直接调用run()方法呢?

因为start()是用来启动线程,run()方法只是执行线程运行时的代码,如果直接调用run()方法,也仅仅是调用一个普通的方法而已,和线程的生命周期是没有关系的,还有我们需要注意start()方法调用第二次会报运行时异常。

那你知道sleep和wait/notify的区别是什么吗?

这个也休想难倒咱家。

  • 相同:

    1. 他们都可以让线程进入阻塞状态。
    2. 他们都可以响应中断Thread.interrupt。
  • 不同点

    1. sleep() 来自 Thread,wait() 来自 Object。
    2. sleep() 不释放monitor锁,但wait() 会释放。
    3. sleep() 时间到会自动恢复,wait() 可以使用 notify()/notifyAll()直接唤醒。
    4. wait方法需要在同步方法中执行,而sleep不需要。

你知道yeid和sleep有什么区别吗?

好家伙,还好我准备的充足,yield的作用是让出自己的时间片,线程依旧处于Runnable状态,依然有可能被再次调度,而sleep被调用后会进入阻塞状态,在等待时间内不会被线程调度器调用,

回答的还可以,都快赶上我了,那还有一个问题,守护线程和普通线程的区别你有了解吗?

握草,午饭时间到了,不和你说了,今天暂且到这,等老衲补充一下营养,明天再会会你。

总结

以上就是今天介绍的多线程基础知识,这块知识点比较多,这里花Gie也会分多个篇幅来介绍,我敢向狗剩子保证,只要你认真跟好花Gie的这一系列,面试必能小虐面试官,如果不能...那我把狗剩子送给你。

万丈高楼平地起,花Gie认为只有打好基础,认真修炼内功,才能走的更轻松,也更远。

点关注,防走丢

以上就是本期全部内容,如有纰漏之处,请留言指教,非常感谢

《蹲坑就能进大厂》多线程这几道基础面试题,80%小伙伴第一题就答错相关推荐

  1. 2021-02-252021 互联网大厂年度总结1000+道高频面试题(附答案解析)冲刺2021

    2021 互联网大厂年度总结1000+道高频面试题(附答案解析)冲刺2021 1.String类能不能被继承?为什么? 不能 因为string类是被final修饰的类,final修饰过的类不能被继承. ...

  2. 《逆袭进大厂》第十二弹之MySQL重点篇27问27答

    大家好,我是阿秀. 我来更新了,本期是 MySQL 第二期,至此 MySQL 部分就全部更新完毕了,下一弹就是 Redis 篇了. 上一篇文章中,小伙伴建议将资料按照更细粒度去整理一番,我觉得是非常不 ...

  3. 《我想进大厂》之mysql夺命连环13问

    想进大厂,mysql不会那可不行,来接受mysql面试挑战吧,看看你能坚持到哪里? 1. 能说下myisam 和 innodb的区别吗? myisam引擎是5.1版本之前的默认引擎,支持全文检索.压缩 ...

  4. 此异常最初是在此调用堆栈中引发的:_【8】进大厂必须掌握的面试题Java面试异常和线程...

    点击上方"全栈程序员社区",星标公众号 重磅干货,第一时间送达 Q1.错误和异常有什么区别? 错误是在运行时发生的不可恢复的情况.如OutOfMemory错误.这些JVM错误无法在 ...

  5. 秋招来袭,想学习Java进大厂的小伙伴,这7点武林秘籍一定要点开看看!(附一线互联网大厂MySQL面试高频考点)

    转眼间六月已经过了十天了.六月虽是盛夏,但秋招也不远了.提早做好准备才能在实战中游刃有余. 今天整理更新一篇Java学习分阶段路线攻略.希望能给大家一些启发,找到一条属于自己的学习线路. 本文为转载. ...

  6. 听说你想进大厂?当心这13个MySQL送命题!

    想进大厂,mysql不会那可不行,来接受mysql面试挑战吧,看看你能坚持到哪里? 1. 能说下myisam 和 innodb的区别吗? myisam引擎是5.1版本之前的默认引擎,支持全文检索.压缩 ...

  7. 奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些并发编程知识是你必须要掌握的!完整学习路线!!(建议收藏)

    大家好,我是冰河~~ 今天给大家带来一篇完整的并发编程学习路线,这应该是全网最全的并发编程学习路线了吧,希望能够为各位小伙伴们带来实质性的帮助. 如果这篇文章对大家有点帮助,小伙伴们点赞,收藏,评论, ...

  8. 进阿里了——分享一波进大厂经验

    文章目录 前言 一.应聘渠道 1.常规渠道 2.内推 3.论坛社交类 4.招聘会 5.企业官网 二.简历优化 1.第一印象 2.基本情况描述 3.技能和项目经验 4.加分项 5.不能做 三.知识点梳理 ...

  9. 进大厂一条龙服务(Java核心面试知识点+一线大厂Java笔试面试题+月薪3万Java优秀简历模板),看这篇就够了

    你有没有觉得Java_工程师竞争压力大.就业困难?不知道面试Java工程师应该准备些什么?.. 现在一切都解决了!你想要的干货知识和面试题统统在这,还有月薪3万Java优秀简历模板,快拿回去嚼烂吧! ...

最新文章

  1. 上传文件大小的配置Webcong
  2. 忙的连自己姓什么都不知道啦...
  3. Qt--qss(暗橙色)
  4. 分布式高性能消息处理中心HPMessageCenter
  5. 详解Class类文件的结构(下)
  6. 接收用户的输入 Scanner类
  7. 三元表达式、列表推导式、生成器表达式、递归、内置函数、匿名函数
  8. 计算机维修 主板 打印机,一台电脑带电拨打印机接口 ,烧坏主板,不能开机
  9. 浏览器市场 Chrome 仍占主导地位,IE 继续下降
  10. 使用 MSDeploy 部署网站
  11. SVN 客户端的安装与配置
  12. Tracert命令原理
  13. 微前端(single-spa和qiankun)
  14. 飞天2.0面向万物智能的操作系统正式启幕
  15. 图片批量加边框,详细操作步骤
  16. 程序在单片机里是如何运行的?
  17. 修复 iPhone X H5 底部安全区域定位按钮下内容穿透 BUG
  18. 英语情景对话计算机专业,英语情景对话 寒假生活 5人
  19. 发现了一个好网站.绝不是打广告,独乐乐不如众乐乐.
  20. python画图心形_通过matplotlib绘制心形

热门文章

  1. [渝粤教育] 西南政法大学 经济法学 参考 资料
  2. Day7学习(DHCP与WDS服务)
  3. 电脑断电后无法正常启动怎么办?
  4. 使用scrapy时,没有crawl命令
  5. Nginx访问PHP File not found.
  6. Android ColorUtils
  7. Django计算机毕业设计民宿客房管理系统python(源码程序+lw+远程部署)
  8. 轻松掌握averageif(s)、countif(s)、sumif(s)等逻辑计算函数用法
  9. 四月初再不跳,就晚了
  10. ng-include指令