前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程系列问题汇总

多线程系列问题汇总

作者头像
happyJared
发布2019-07-03 11:18:56
4640
发布2019-07-03 11:18:56
举报
文章被收录于专栏:happyJaredhappyJared
  1. 什么是上下文切换?

多线程编程中,一般线程的个数都大于 CPU 的核心个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效的执行,通常 CPU 采取的策略是:为每个线程分配时间片 + 轮转的形式。当线程的时间片用完时,CPU 就会重新处于就绪状态,并让其他线程使用,这整个过程就属于一次上下文切换。

当前任务在执行完 CPU 时间片并切换到另一个任务之前,会先保存自己的状态,以便下一次再切换回这个任务时,可以再次加载这个任务的状态。任务从保存到再加载的过程,就是一次上下文切换。

Linux 相比于其他操作系统(包括类 Unix 系统)有很多的优势,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。

  1. 说说 Thread.sleep() 方法和 Object.wait() 方法的区别和共同点?
  • 区别点:sleep() 方法没有释放锁,而 wait() 方法释放了锁;
  • 共同点:两者都是暂停线程的执行;wait() 通常用于线程间的交互/通信,sleep() 通常被用于暂停方法的执行;
  • wait() 方法调用后,线程不会自动苏醒,需要别的线程触发调用同个对象上的 notify() 或者 notifyAll() 方法来唤醒(但也不一定保证成功),或者使用 wait(long timeout) 方法,超时后线程会自动苏醒。sleep() 方法执行完后,线程会自动苏醒。

Object.wait()

Object.wait(long timeout)

Thread.sleep()

Thread.start()

可以观察到,最终执行的都是 native 方法

  1. 为什么调用 Thread.start() 方法时会执行 run() 方法,为什么不能直接调用 run() 方法?

new Thread() 后,线程进入新建状态;调用 start() 方法,相当于启动线程并使线程进入就绪状态,从操作系统分配到时间片后,线程才开始正式运行。start() 会执行线程的相应准备工作,然后自动执行 run() 方法中内容,这是真正的多线程工作;而直接执行 run() 方法,会把 run() 方法当成 main 线程下的普通方法来执行,并不会另起个线程来执行,因此这并不是多线程工作方式。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.07.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档